protected function updateEstimate($processed = null)
    {
        // The previous chunk size processed, from either the caller, or the last estimate
        $previous = $processed !== null ? $processed : $this->estimate;

        // dx/dt of last observation, per second rate
        $time     = ($this->end - $this->begin);
        $observed = $previous / $time;

        // Update the average
        $this->average = $this->updateExponentialAverage($this->average, $observed);

        // Calculate the new estimate
        $this->estimate = (int)round($this->average * $this->target, 0);

        // Clamp it if needed
        $this->clampEstimate();

        // Report
        $this->logger->notice(
            'Chunk size update: {p}, {d}/{n}s, {r}/{nr} -> {e} {c}',
            [
                'p'  => $previous,
                'd'  => $time,
                'n'  => $this->target,
                'r'  => $observed,
                'nr' => $previous / $this->target,
                'e'  => $this->estimate,
                'c'  => ($this->clamped ? '(clamped)' : '')
            ]
        );

        $this->checkPause();

        // And reset
        $this->begin = null;
        $this->end   = null;
    }