Как вы подходите к парсингу большого файла?

«Как вы подходите к парсингу большого файла?» — вопрос из категории Алгоритмы и структуры данных, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основной принцип — потоковая обработка (streaming), чтобы не загружать файл целиком в оперативную память. Конкретные инструменты зависят от формата файла.

Для текстовых файлов (логи, CSV):

$handle = fopen('huge_file.csv', 'r');
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // Обрабатываем каждую строку отдельно
        processLine($line);
    }
    fclose($handle); // Важно освободить ресурс
}
// Для CSV можно использовать fgetcsv($handle)

Для XML: Использую XMLReader, который считывает документ как поток узлов.

$reader = new XMLReader();
$reader->open('large_data.xml');
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name === 'item') {
        // Обрабатываем только нужные элементы
        $data = $reader->expand()->textContent;
        processItem($data);
    }
}
$reader->close();

Для JSON: Если это NDJSON (Newline Delimited JSON), читаю построчно. Для больших монолитных JSON файлов ищу специализированные потоковые парсеры, например, JsonStreamingParser.

Ключевые правила:

  1. Никогда не использовать file_get_contents() для больших файлов.
  2. Обрабатывать данные порциями (по строке, по узлу, по чанку).
  3. Всегда явно закрывать файловые дескрипторы или объекты парсеров.