Задать вопрос
FitTech
@FitTech

Растет память при чтении большого json?

Здравствуйте! Ранее писал вопрос про чтение большого файла JSON. Посоветовали использовать json stream parser, потому что сначала использовал из-за отсутствия знаний json_decode:).

При использовании парсера нагрузка упала, но что заметил, при выполнении кода, по чуть-чуть нагрузка на память всё равно растет(по 0.1%) началась задача с 2%, а дошло до 8.

Ниже приведу код который обрабатывает большой файл(всё внес в один метод для быстрого чтения тут).

Для json использовал это: https://github.com/skolodyazhnyy/json-stream

private 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
  • Вопрос задан
  • 304 просмотра
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@Nujabes37
:DEATH
Ты можешь подключить профилировкщик и посмотреть, что именно так нагружает систему) Советую xhprof.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы