2015-10-13 52 views
0

因此,我发现了很多文章,其中人们在使用rails将大数据导出为CSV时遇到了问题。我能够做到这一点,但每20千行大约需要40秒。Rails:将数百万行导出到csv

有没有人克服过这个问题?我在过去几个小时到处搜索,找不到适合我的东西。

谢谢!

+1

所以它每秒做500行?这对我来说似乎没问题。难道你不会花最后几个小时简单地做一些其他的事情,而完成输出CSV? –

+0

如果你确实想加快速度,你可以尝试“预先加载”所有的数据,所以你没有再次击中每一行的数据库。 –

+0

如何在多个进程中生成它?例如进程1生成记录1至100000,然后保存为file1.csv,进程2生成记录100001至200000,然后另存为file2.csv。全部过程完成后。使用cat命令将每个子文件合并到最终文件中。 – Calvin

回答

1

假设您想要将1k行加载到CSV中。您可以编写一个rake任务,它接受限制和偏移量以从表中提取数据。然后写一个Ruby脚本类似下面

batch_size = 100 
offset = 0 
for i in 0..9 
    nohup rake my_task:to_load_csv(batch_size, offset, index) > rake.out 2>&1 & 
    offset += batch_size 
end 

**参考this链接了解更多有关如何在后台运行耙

耙任务将是这样

namespace :my_task 
    task :load_csv, [:limit, :offset, :index] :environments do 
    # write code here load data from table using limit and offset 
    # write the data returned in above query to FILE_NAME_#{index}.csv 
    end 
end 

一旦你看到所有的rake任务都结束了所有文件的索引。如果你想自动化文件组合过程,你需要编写一些代码进行过程监控。您必须grep所有活动的rake任务并将其PID存储在数组中。然后每15秒钟或某事尝试使用阵列中的PID获取进程的状态。如果进程不再运行,则从数组中弹出PID。继续执行,直到数组为空,即所有的耙子都已完成,然后按索引合并文件。 希望这可以帮助你。谢谢!