2015-10-13 90 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。繼續執行,直到數組爲空,即所有的耙子都已完成,然後按索引合併文件。 希望這可以幫助你。謝謝!