使用Sidekiq,Resque等导入CSV行的块

时间:2015-12-01 07:23:01

标签: ruby-on-rails postgresql sidekiq resque

我正在编写一个导入程序,用于将CSV文件中的数据导入数据库表。为了避免将整个文件加载到内存中,我使用Smarter CSV将文件解析为100个块,一次加载一个块。

我将把每个100块传递给后台作业处理器,如Resque或Sidekiq,以批量导入这些行。

  1. 传递100行作为作业参数会产生一个约5000个字符长的字符串。这是否会导致一般问题或特别是后端存储问题(例如Sidekiq使用Redis - Redis是否允许存储该长度的密钥?)。我不想一次导入一行,因为它为50,000行文件创建了50,000个作业。

  2. 我想知道整体导入的进度,所以我计划让每个作业(大块的100个)更新一个DB字段,并在完成后将计数增加1(不确定更好的方法? )。由于这些作业并行处理,是否存在两个作业尝试将相同字段更新为1并相互覆盖的危险?或者DB写入锁定表,因此一次只能写一个?

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

  

传递100行作为作业参数会产生一个约5000个字符长的字符串。

Redis可以毫无问题地处理它。

  

由于这些作业并行处理,是否存在两个作业试图将同一字段更新为1并相互覆盖的危险?

如果您阅读+设置,那么是的,它会受到竞争条件的影响。您可以利用redis执行任务并使用其原子INCR。

  

为避免将整个文件加载到内存中,我使用Smarter CSV将文件解析为100个块

取决于你对这些行做了些什么,但我自己说,5k行本身并不会对记忆造成很大压力。