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

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, проблема снова появилась.
  • Вопрос задан
  • 238 просмотров
Подписаться 4 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
New_Horizons
@New_Horizons
Бред:
Есть такая либа, для разбора json из стрима по частям.
https://github.com/salsify/jsonstreamingparser
Сам не пробовал, но вроде как она решает проблему нехватки памяти при больших объёмах json.

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

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

Похожие вопросы
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект
22 дек. 2024, в 19:47
3000 руб./за проект