2009-10-16 83 views
2

我正在使用FasterCSV將上傳的文件導入到模型中,它對於小文件非常適用。但是,當我嘗試導入一個大型數據集(21,000行)時,它需要很長時間,並且我在實時服務器上看到了瀏覽器超時。在Rails中批量導入CSV?

這是我目前的工作代碼:

logcount=0 
    Attendee.transaction do 
    FCSV.new(file, :headers => true).each do |row| 
     row[1] = Date.strptime(row[1], '%m/%d/%Y') 
     record = @event.attendees.new(:union_id => row[0], :dob => row[1], :gender => row[2]) 
     if record.save 
     logcount += 1 
     end 
    end 
    end 

我喜歡使用一個後臺進程,但用戶需要看到有多少行是進口的,纔可以移動到系統的下一步。

所以,我在想我應該使用action chunking,只讀取較少的行數,設置一個計數器,然後用某種進度更新視圖,然後再次使用前一個計數器作爲起點運行該方法。

我似乎無法看到如何讓FasterCSV只讀取一定數量的行,並且還爲起始點設置偏移量。

有誰知道如何做到這一點?還是有更好的方法來處理這個問題?

回答

2

您是否嘗試過使用AR Extensions進行批量導入? 將數千行的行插入數據庫時​​,您會獲得令人印象深刻的性能改進。 訪問他們的website瞭解更多詳情。

+0

對於任何人在看這個死鏈接:https://web.archive.org/web/20080729041651/http://www.continuousthinking.com/tags/arext – MaicolBen 2017-04-26 13:29:40

0

我寧願創建一個準備好的查詢,從文件中加載一行並執行準備好的查詢。沒有任何使用模型,應該更快。

+0

你能舉個例子說明你的意思嗎?你覺得它不會需要發送更新到瀏覽器足夠快嗎? – Les 2009-10-16 18:44:46

+0

不能輸入21000條記錄。 – EmFi 2009-10-16 18:53:52

0

如果你有數據庫,爲什麼不通過Rake Task導入它?你的用戶是否會導入這樣的大型數據庫?

如果您的用戶將要導入這樣的大型數據庫,任務將不會執行。

FCSV.new可以採用IO.open的任何選項。你可以使用它來尋找一個特定的字節。不幸的是,FCSV並不容易停止或訪問底層的IO對象,找出你停下來的地方。在文件中間恢復也會使標題行復雜化。

真的,我認爲最佳的解決方案是將您的CSV導入外包給drb,定期以控制器動作可以接受的方式報告它的進度。然後在客戶端上運行一些AJAX,每隔一段時間調用一次該控制器的動作。

我已經在BackgroundDRb過去取得了成功。它的安裝和使用有點過於詳細,我不能在這裏重現。還有其他一些插件和寶石,可以使用一些Google搜索。

DRb警告大多數DRb解決方案都需要在服務器上運行附加的守護進程。一些網絡主機禁止更多基本計劃。檢查您的TOS