0
因此,我发现了很多文章,其中人们在使用rails将大数据导出为CSV时遇到了问题。我能够做到这一点,但每20千行大约需要40秒。Rails:将数百万行导出到csv
有没有人克服过这个问题?我在过去几个小时到处搜索,找不到适合我的东西。
谢谢!
因此,我发现了很多文章,其中人们在使用rails将大数据导出为CSV时遇到了问题。我能够做到这一点,但每20千行大约需要40秒。Rails:将数百万行导出到csv
有没有人克服过这个问题?我在过去几个小时到处搜索,找不到适合我的东西。
谢谢!
假设您想要将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。继续执行,直到数组为空,即所有的耙子都已完成,然后按索引合并文件。 希望这可以帮助你。谢谢!
所以它每秒做500行?这对我来说似乎没问题。难道你不会花最后几个小时简单地做一些其他的事情,而完成输出CSV? –
如果你确实想加快速度,你可以尝试“预先加载”所有的数据,所以你没有再次击中每一行的数据库。 –
如何在多个进程中生成它?例如进程1生成记录1至100000,然后保存为file1.csv,进程2生成记录100001至200000,然后另存为file2.csv。全部过程完成后。使用cat命令将每个子文件合并到最终文件中。 – Calvin