【问题标题】:Should file object be sent to sidekiq worker是否应该将文件对象发送给 sidekiq 工作人员
【发布时间】:2015-02-17 13:42:04
【问题描述】:

我想知道 fileobject 是否可以发送给 sidekiq worker,我已经尝试过了,它工作正常,我担心性能,例如,如果我有一个 1000 行的 CSV,那么我应该发送文件对象,例如

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

这种方法可行,但由于文件包含很多行,我担心是否应该将该文件对象作为参数传递给 sidekiq worker。

我尝试了其他一些方法,例如使用

CSV.parse(params[:bulk_update_csv_file].read, headers: true),然后将对象切成大约 500 行,然后将具有 500 行的 CSV 解析器对象发送给 sidekiq 工作人员,但我收到错误 SystemStackError (stack level too deep):

我尝试过的另一种方法是将每一行转换为哈希,然后将其发送到 sidekiq worker,它也可以正常工作。很高兴知道这里最好的方法是什么,即使有 10000 行。

我最后的办法是保存文件并将路径的链接发送给sidekiq worker,但如果没有这种方法可以做到这一点,那就太好了。

【问题讨论】:

  • 保存文件并将路径发送给 Sidekiq 怎么样?
  • 是的,我也想过,但那将是我最后的手段。
  • 不清楚你在问什么,因为你确实说你目前的方法有效。

标签: ruby csv ruby-on-rails-4 sidekiq


【解决方案1】:

来自Sidekiq Wiki

不要将状态保存到 Sidekiq,保存简单的标识符。

文件的内容是状态,文件的路径是一个简单的标识符。

结论:发送文件路径,让 Sidekiq Worker 读取文件。

【讨论】:

  • 发送文件路径不会超出一台机器。
  • @MikePerham 是的,但是在 Redis 中存储 1GB 文件意味着 Redis 将只为该文件使用 1GB RAM,因为它是内存存储。我猜正确答案取决于服务器设置和文件大小。
  • 或者您使用特定于主机的队列,如下所述:mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多