Здравствуйте! Ранее писал вопрос про чтение большого файла
JSON. Посоветовали использовать
json stream parser, потому что сначала использовал из-за отсутствия знаний
json_decode:).
При использовании парсера нагрузка упала, но что заметил, при выполнении кода, по чуть-чуть нагрузка на память всё равно растет(по 0.1%) началась задача с 2%, а дошло до 8.
Ниже приведу код который обрабатывает большой файл(всё внес в один метод для быстрого чтения тут).
Для json использовал это:
https://github.com/skolodyazhnyy/json-streamprivate function prepareAndSave($json, DocumentManager $documentManager)
{
$data = [];
$iteration = 0;
$savedNumber = 0;
$fh = fopen($json, "r");
while (!feof($fh)){
try {
$reader = new Reader($fh);
$reader->enter('items', Reader::TYPE_OBJECT);
$object = $reader->read();
$data[] = [
'some_id' => $object['some_id'],
'some_data' => $object['some_data'],
'images' => isset($object['images']) ? $object['images'] : [],
];
} catch (\Exception $exception) {
continue;
}
$iteration++;
// Batch_size = 2000
if (count($data) >= self::BATCH_SIZE) {
try {
$documentManager->getDocumentCollection(MyDocument::class)->batchInsert($data);
$iteration = 0;
$data = [];
} catch (\Exception $exception) {
echo "Exception in saving to Mongo \r";
continue;
}
echo "Number of saved data: $savedNumber \r";
}
$reader->leave();
}
if (!empty($data)) {
try {
$documentManager->getDocumentCollection(MyDocument::class)->batchInsert($data);
} catch (\Exception $exception) {
echo "Exception in saving to Mongo at the end. \r";}
}
fclose($fh);
}
С помощью профилирования определил что:
больше всего памяти берут вот эти два момента:
Ссылка на клас Tokenizer:
Метод readSymbol() берет больше всего (30 гб), потом readKeyToken() (8гб), а потом readValue() ( 4гб)
Это в отчете
Memory Hogs