Как извлечь данные из веб-службы в массив, а затем сохранить в базе данных, не исчерпывая лимит памяти? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь получить большое количество (категорий) функций (данных) из веб-службы. Получение всех данных через веб-сервис занимает довольно много времени (время отклика и т. Д. Более 5 часов). Но я получаю ошибку «Разрешенный объем памяти 134217728 байт исчерпан» после первого часа.

У меня есть категории, хранящиеся в моей локальной базе данных. Чтобы получить функции категории, я просто использую идентификатор этой категории, и сервис возвращает мне функции этой категории. Я мог бы сохранить эти возвращенные данные немедленно в БД, но тогда я не смог бы использовать функции, пока весь процесс занимает.

Вместо этого я пытаюсь сохранить все данные результатов в массиве и после завершения всего цикла сохранить весь массив в БД. Таким образом, функции будут заблокированы только на время записи (около 5 минут).

чтобы показать примерно:

foreach($categories as $category){
    $features = $webService->getCategoryFeatures($category->id);
    // ...and some other logics
}

foreach($features = $feature){
    App\Feature::create($feature);
    // ...and some other logics
}

Есть около 4000 категорий. Некоторые категории имеют более 30000 функций. Так что первая последовательность занимает довольно много времени. Вторая последовательность, в которой я просто сохраняю данные в БД, занимает всего несколько минут.

Мне нужен способ, где я могу временно сохранить возвращенные функции без ошибки памяти. Кроме того, я не хочу увеличивать лимит.

Любые идеи будут оценены.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

На самом деле я придумал простое решение. Я создал временную таблицу (categoryies_temp) и начал весь процесс с этой таблицей. Таким образом, даже если это займет много времени, оригинальная таблица все еще будет в рабочем состоянии.

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

0 голосов
/ 09 сентября 2018

заставляет веб-сервис возвращать ограниченные записи с вводом номера страницы. позвоните в веб-сервис с увеличением номера страницы и сохраните полученный результат в базе данных. Звоните снова с номером следующей страницы, пока не получите 0 результата от номера страницы. прекратите звонить веб-сервису после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...