Сейчас реализована через файл.
Добавляю элементы, дописывая в конец файла, каждый элемент с новой строки.
Беру N элементов очереди через awk и после обработки каждого єлемента удаляю через awk.Хочется упростить свой велосипед, уменьшить IOPS.
Использовать Redis ? memcache ?
> Сейчас реализована через файл.
> Добавляю элементы, дописывая в конец файла, каждый элемент с новой строки.
> Беру N элементов очереди через awk и после обработки каждого єлемента удаляю
> через awk.
> Хочется упростить свой велосипед, уменьшить IOPS.
> Использовать Redis ? memcache ?Просто хранить файл в ОЗУ (tmpfs)?
> Сейчас реализована через файл.
> Добавляю элементы, дописывая в конец файла, каждый элемент с новой строки.
> Беру N элементов очереди через awk и после обработки каждого єлемента удаляю
> через awk.
> Хочется упростить свой велосипед, уменьшить IOPS.
> Использовать Redis ? memcache ?Упрощение велосипеда зависит области его применения. Следует определить что реально вам от него надо, из этого будет очевиден путь его упрощения.
Вы же описали сам велосипед, без того зачем он нужен.
>> Сейчас реализована через файл.
>> Добавляю элементы, дописывая в конец файла, каждый элемент с новой строки.
>> Беру N элементов очереди через awk и после обработки каждого єлемента удаляю
>> через awk.
>> Хочется упростить свой велосипед, уменьшить IOPS.
>> Использовать Redis ? memcache ?
> Упрощение велосипеда зависит области его применения. Следует определить что реально вам
> от него надо, из этого будет очевиден путь его упрощения.
> Вы же описали сам велосипед, без того зачем он нужен.Поясню свою мысль:
самая простая очередь - это на перле массив.
push помещает в конец массива строку
shift- берет с начала массива строку и удаляет ее из массива.
делаете это в бесконечном цикле...Эффективность - на порядки выше вашего решения. Применимость в вашем случае - под вопросом.
Или, если ваше приложение подвержено большим нагрузкам - пойти в поисковик и набрать "сервер очередей". Тот же Gearman к примеру. Промышленное решение рекомендованное лучшими блогописателями :)
Применимость его в вашем случае- под еще большим вопросом.
> Применимость его в вашем случае- под еще большим вопросом.Спасибо.
Смотрю в сторону
A script for running processes in parallel in Bash - https://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-f.../и
Simple job queue in Bash using a FIFO - https://blog.garage-coding.com/2016/02/05/bash-fifo-jobqueue...
И gearmand интересно.
> И gearmand интересно.Есть еще beanstalkd, знакомые веб-разработчики почему-то на него ушли с gearmand.
Не знаю, насколько он интересен в сравнении с gearmand.
> Использовать Redis ? memcache ?Ты бы ещё суперкомпьютер купил.
mkfifo queue
process1 > queue &
process2 < queue4Mбайт буфер для твоих строк. Бонусом получаешь синхронизацию - если один процесс быстрее другого, то он будет притормаживать на I/O.
> быстрее другого, то он будет притормаживать на I/O.Это очень, очень плохой подход.
> Это очень, очень плохой подход.Чем же?
>> Это очень, очень плохой подход.
> Чем же?Тем, что притормаживает. Можно молча выбрасывать строки, которые не успели обработать.
Micro$oft way - Word именно так печатает документы, в которых обсчитался с нумерацией страниц.
>>> Это очень, очень плохой подход.
>> Чем же?
> Тем, что притормаживает.фейспалм.тхт
Ну, значит никсовые пайпы, на которых строятся конвейеры процессов, и которые существуют на свете дольше, чем вы - это "очень, очень плохой подход"?
Пионеры юные, головы чугунные (с)
//Схватился за головуИспользовать /dev/head
Если вы любите файлы, то должны понимать, что ФС это на самом деле БД, и строчкой в ней является сам файл, а не строка в файле.
Вместо файла делаете директорию. В ней уже файлы с задачами. Обрабатываете эти файлы по отдельности и удаляете после. Выгода в том, что процессы ставящие задачи не ждут, пока другие туда запишут. Процессы исполнители можно запускать как угодно.
while true
do
find tasks -type f |
xargs -l -I{} sh worker.sh {} 2>&1 >>workers.log && rm -f {}
sleep 1;
doneКак тут заметили, директорию можно смонтировать как тмпфс. Тогда вся жизнь будет происходить в памяти. Но при ребуте сервера вы будете терять данные. Если задания не критичные, то вперед. Я бы так делать не стал.
PS
Могу для вас похожие проблемы решать за небольшие биткоины.
Решение для удаления файлов кроме трех последних тоже мое.