Guzzle and big response?

Добрый вечер. Объясните пожалуйста, как действовать и как это обрабатывать.
Я делаю запрос к удаленному серверу, сервер возвращает массив в JSON представлении. В массиве может быть более 100 тысяч записей.
Примерно следующего вида
[
1 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
4 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
66 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
99 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
]


Мне нужно получить весь массив, потом определенным образом его спарсить и положить все это дело в базу.
Чтобы получить данные массив я делаю запрос следующего вида
$guzzle = new \GuzzleHttp\Client();
$response = $guzzle->request('GET', $api_url, ['stream' => true])->getBody();
$response = $response->getContents();
$response = json_decode($response, true);


После чего в дело летит форич и я делаю свои грязные дела и на основе ответа, создаю 2 массива и добавляю в базу.
Но все время вылетаю по памяти, как можно этот момент исправить, чтобы не вылетать по памяти, но и не увеличивать ее объем.

И я не понимаю, я вылетаю на моменте персинга данных или, когда строю массив на основе ответа и в переменную попадает массив в котором более 30к элементов.
$data = array_chunk($response, 500, true);

Я предположил, что нужно чанкать ответ и проблема ушла, на первый взгляд все работало. Но мне нужно сохранять оригинальные ключи, следовательно, передав третьим аргументом true, проблема снова появилась.
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 1
New_Horizons
@New_Horizons
Есть такая либа, для разбора json из стрима по частям.
https://github.com/salsify/jsonstreamingparser
Сам не пробовал, но вроде как она решает проблему нехватки памяти при больших объёмах json.

Вы пишете что на основе ответа создаёте другие массивы, так что возможно этот вариант не подойдёт, если нужны все данные сразу, чтобы создать эти массивы.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 100 000 руб.
АКМЭ сервис Санкт-Петербург
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.