Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Пакетная обработка данных


Автор: EasyTask 18.12.2012, 03:14
Добрый день! Интересно поискать способ решения для следующей проблемы:

У нас имеются некие данные, которые получаются построчно (mysql_fetch или построчное чтение из файла, важное условие - изначально мы не знаем количество полученных строк). Нам необходимо формировать из этих данных определенный стек и выполнять некое действие, когда в стеке накопится достаточное количество данных. Например:

Построчное чтения из файла 1.txt строками в котором являются идентификаторы
-- 1 Итерация мы сохраняем идентификатор из 1 строки
-- 2 Итерация мы сохраняем идентификатор из 2 строки
-- 3 Итерация мы сохраняем идентификатор из 3 строки
-- В стеке накопилось три сообщения - выполняем некое действие

Сейчас, в общем виде, у меня получилось такое решение для этой задачи:

У меня существует определенный класс, который добавляет данные в стек и по накоплению заданного количества записей в стеке выполняет некое действие, проблема в том, что делать когда размер пакета не кратен количеству исходных данных. Например мы решили формировать пакеты из 3 сообщений стека, а в исходных  данных у нас 11 строк. Последние 2 строки выпадут и не будут обработаны, т.к не будет добавлено третьего сообщения, обеспечивающего окончательное формирование пакета и выполнение обработки. Сейчас проблема решена таким образом, что после цикла получения данных, выполняется еще одна проверка, не осталось ли сообщений в стеке, и если они там есть - еще раз выполнить процесс обработки. Но мне не очень нравится этот подход, поэтому мне интересно послушать ваши решения - существует ли какой то способ, прямо внутри цикла определить что это последние получаемые данные и последний пакет нужно обрабатывать не полным?

Автор: Arantir 18.12.2012, 03:46
Цитата(EasyTask @  18.12.2012,  02:14 Найти цитируемый пост)
существует ли какой то способ, прямо внутри цикла определить что это последние получаемые данные

Люди такие интересные вопросы задают =) Это скорее философский вопрос, чем вопрос программирования.

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

Вот небольшой условный пример, демонстрирующий складывание по 3 и выполнение каждые 3 или же при окончании данных:
Код

while(!$file_ends)
{
    $rows = 0;
    while($rows < 3 && !$file_ends)
    {
        $some_stack->add($some_data);
    }
    $some_stack->execute();
}
Вот что мешает вам реализовать такую схему у себя?

Автор: EasyTask 18.12.2012, 09:22
этот вариант ничем не лучше представленного мной варианта smile интересует именно алгортим, который бы не нуждался в каких то дополнительных циклах/проверках вне класса выполняющего пакетную обработку.

Автор: skyboy 18.12.2012, 09:42
Цитата(EasyTask @  18.12.2012,  08:22 Найти цитируемый пост)
интересует именно алгортим, который бы не нуждался в каких то дополнительных циклах/проверках вне класса выполняющего пакетную обработку. 

алгоритмически это не решается, так как
Цитата(EasyTask @  18.12.2012,  02:14 Найти цитируемый пост)
важное условие - изначально мы не знаем количество полученных строк

вызывать за пределом цикла обработку вполне допустимо.
единственный совет — вынести код обработки в отдельную функцию, чтоб это не был суровый копипаст на 20+ строк.

Автор: Aliance 18.12.2012, 10:38
Кстати, недавно прочитал о SplStack, может будет полезно: http://habrahabr.ru/post/161987/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)