Как обработать ОЧЕНЬ большой массив данных (CRON, CRON QUEUE ...) ? Мозговой штурм need.

Главные вкладки

Аватар пользователя olejonok olejonok 31 декабря 2015 в 20:21

С Наступающим всех!

Вводные данные:
Есть текстовый файл (50Мег, 110тыс строк). В каждой строке подготовленные данные одной записи в БД.

Пробовал :
1. просто натравить скрипт (открываем файл, считываем строку, апдейтим mySQL, считываем след. строку, апдейтим mySQL и т.д.).
Уперлись в предел выполнения скрипта по времени. Обломс.
2. считать все данные в массив, который через CRON QUEUE будет потихоньку обработан за несколько итераций (60секунд на каждую, на пример).
Уперся в ограничение памяти - не лезет мой массив в память.

Думаю с какой стороны подойти к этому вопросу.
Что подскажете?
Спасибо.

Комментарии

Аватар пользователя olejonok olejonok 1 января 2016 в 3:21

насколько я въехал в этот модуль, там непосредственно в функцию обработчик передается текущий номер записи в массиве, под которым у меня будет номер строки в текстовом файле. Так получается каждый раз мне придется этот файл открывать, позиционировать на $i строчку, считывать ее, обновлять mySQL и закрывать файлик. Это будет одна итерация. и таких у меня будет 100тыс. нерационально как-то.

Аватар пользователя olejonok olejonok 31 декабря 2015 в 23:27

Тоже об этом думал, нарезать штук на 20 и крон запускать каждые 3 минуты наверное. Тот при запуске ищет маленькие куски, нашел кусок (любой) - обработал, удалил кусок и завершился. Следущий запуск аналогично. До тех пор пока кусков не останется.
Хорошо ли это ? Smile

Аватар пользователя Orion76 Orion76 31 декабря 2015 в 21:43

Делите одну большую задачу на много маленьких..
Не помогло? еще раз...
Стопроцентный вариант..

Да.. queue - это самое оно...

Всем добра.. с наступающим-)

Аватар пользователя olejonok olejonok 1 января 2016 в 3:03

Итого: порезал файл на маленькие файлики. И каждый по отдельности "засосал" в очередь. А обработку очереди повесил на queue . Сижу смотрю - улетают кусочки со свистом Smile Спасибо всем за подсказки.
С Новым Годом !

Аватар пользователя dashiwa dashiwa 1 января 2016 в 13:35

Импровизировать) Или немножко почитать про алгоритмы,такие задачи попадаются редко но хоть позволяют думать

Аватар пользователя dashiwa dashiwa 1 января 2016 в 17:00

110тыс строк). В каждой строке подготовленные данные одной записи в БД. --> Mysql поддерживает свои механизмы импорта данных,которые гораздо быстрее раоты через php. так как на си построены

Аватар пользователя olejonok olejonok 2 января 2016 в 17:12

p.S. Засасывание мелких файлов субъективно увеличивает время отклика сайта на внешние вопросы. Этот аспект поставил в List ToDo для будущей оптимизации. может ваш вариант как раз и решит данную проблему. Спасибо.

Аватар пользователя olejonok olejonok 2 января 2016 в 18:36

Спасибо и на этом. Посмотрел модулек FEEDS - интересный Smile Все через интерфейс делается Smile Для ленивых точно. Запомнил. Вернусь еще к нему.

Аватар пользователя Orion76 Orion76 3 января 2016 в 0:58

Feeds не для ленивых... у него мощное АПИ.. он для умных..
Минимум движений, и грузим откуда хотим, парсим как надо, и импортируем как надо...(fetcher, parser, processor)

А если все более-менее стандартно, то да.. с настройками разобрался, мышкой покликал и все импортируется..

Аватар пользователя olejonok olejonok 3 января 2016 в 1:06

Ну да, все это уже сделано, правда ручками.
Коннектимся, скачиваем, парсим, валидэйт, вывод порционно в файлики. Крон файлики кушает и заносит в БД.
Попробую на него время потратить при следующем импорте чего-либо Smile
Больше всего волнует: минимизация аппетита к ресурсам Smile
Спасибо.

Аватар пользователя dashiwa dashiwa 3 января 2016 в 6:58

olejonok wrote:

Засасывание мелких файлов субъективно увеличивает время отклика сайта на внешние вопросы

При заргузке файла соединения апача не обрывается по таймауту, а держится при всем процессе загрузки.

Аватар пользователя dashiwa dashiwa 4 января 2016 в 6:17

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