Должен ли файловый объект быть отправлен на sidekiq worker

Я хотел бы знать, можно ли отправить файловый объект рабочему sidekiq, я пробовал это, и он отлично работает, меня беспокоит производительность, например, если у меня есть CSV с 1000 строками, тогда я должен отправить файловый объект для например

SidekiqWorker.perform_async(params[:bulk_update_csv_file].read)

Этот подход работает, но поскольку файл состоит из множества строк, меня беспокоит производительность, если этот файловый объект должен быть передан в качестве аргумента для sidekiq worker.

Я пробовал несколько других вещей, таких как использование

CSV.parse(params[:bulk_update_csv_file].read, headers: true), а затем нарезаю объект примерно на 500 строк, а затем отправляю этот объект синтаксического анализатора CSV с 500 строками рабочему sidekiq, но я получаю сообщение об ошибке SystemStackError (stack level too deep):

Другой подход, который я пробовал, состоит в том, чтобы преобразовать каждую строку в хэш, а затем отправить его на sidekiq worker, который также отлично работает. Было бы здорово узнать, какой подход здесь будет лучшим, даже если строк 10000.

Моим последним средством было бы сохранить файл и отправить ссылку на путь к sidekiq worker, но было бы здорово, если бы это можно было сделать без этого метода.


person Saad    schedule 17.02.2015    source источник
comment
Как насчет сохранения файла и отправки Sidekiq пути?   -  person jcm    schedule 17.02.2015
comment
да, я тоже думал об этом, но это было бы моим последним средством.   -  person Saad    schedule 17.02.2015
comment
Непонятно, о чем вы спрашиваете, поскольку вы сказали, что ваш текущий подход работает.   -  person jcm    schedule 17.02.2015


Ответы (1)


Из Вики Sidekiq:

Не сохраняйте состояние в Sidekiq, сохраняйте простые идентификаторы.

Содержимое вашего файла будет состоянием, путь к файлу будет простым идентификатором.

Вывод: Отправьте путь к файлу и дайте рабочему месту Sidekiq прочитать файл.

person zwippie    schedule 17.02.2015
comment
Отправка пути к файлу не масштабируется за пределы одной машины. - person Mike Perham; 17.02.2015
comment
@MikePerham Это правда, но хранение файла размером 1 ГБ в Redis означает, что Redis будет использовать 1 ГБ ОЗУ только для этого файла, поскольку это хранилище в памяти. Я предполагаю, что правильный ответ зависит от настройки сервера и файлов. - person zwippie; 19.02.2015
comment
Или вы используете очереди для конкретного хоста, как описано здесь: mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues - person Mike Perham; 19.02.2015