我正在编写一个导入程序,用于将CSV文件中的数据导入数据库表。为了避免将整个文件加载到内存中,我使用Smarter CSV将文件解析为100个块,一次加载一个块。
我将把每个100块传递给后台作业处理器,如Resque或Sidekiq,以批量导入这些行。
传递100行作为作业参数会产生一个约5000个字符长的字符串。这是否会导致一般问题或特别是后端存储问题(例如Sidekiq使用Redis - Redis是否允许存储该长度的密钥?)。我不想一次导入一行,因为它为50,000行文件创建了50,000个作业。
我想知道整体导入的进度,所以我计划让每个作业(大块的100个)更新一个DB字段,并在完成后将计数增加1(不确定更好的方法? )。由于这些作业并行处理,是否存在两个作业尝试将相同字段更新为1并相互覆盖的危险?或者DB写入锁定表,因此一次只能写一个?
谢谢!
答案 0 :(得分:1)
传递100行作为作业参数会产生一个约5000个字符长的字符串。
Redis可以毫无问题地处理它。
由于这些作业并行处理,是否存在两个作业试图将同一字段更新为1并相互覆盖的危险?
如果您阅读+设置,那么是的,它会受到竞争条件的影响。您可以利用redis执行任务并使用其原子INCR。
为避免将整个文件加载到内存中,我使用Smarter CSV将文件解析为100个块
取决于你对这些行做了些什么,但我自己说,5k行本身并不会对记忆造成很大压力。