Трябва ли файловият обект да бъде изпратен на sidekiq worker

Бих искал да знам дали fileobject може да бъде изпратен на sidekiq worker, изпробвах това и работи добре, загрижен съм за производителността, например ако имам 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, което също работи добре. Би било чудесно да знаем какъв би бил най-добрият подход тук, дори ако има 10 000 реда.

Последната ми възможност би била да запазя файла и да изпратя връзката на пътя към 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 Wiki:

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

Съдържанието на вашия файл ще бъде състояние, пътят до файла ще бъде прост идентификатор.

Заключение: Изпратете пътя до файла и оставете работника на Sidekiq да прочете файла.

person zwippie    schedule 17.02.2015
comment
Изпращането на файлов път не надхвърля една машина. - person Mike Perham; 17.02.2015
comment
@MikePerham Това е вярно, но съхраняването на файл от 1 GB в Redis означава, че Redis ще използва 1 GB RAM само за този файл, тъй като това е хранилище в паметта. Предполагам, че правилният отговор зависи от настройката на сървъра и размера на файловете. - person zwippie; 19.02.2015
comment
Или използвате специфични за хост опашки, както е обяснено тук: mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues - person Mike Perham; 19.02.2015