2

我正在開發一個Rails應用程序。我想用一個數組來保存2000000數據,然後將數據插入到數據庫中像下面:數組中的大數據

large_data = Get_data_Method() #get 2,000,000 raw data 

all_values = Array.new 

large_data.each{ |data| 

    all_values << data[1] #e.g. data[1] has the format "(2,'john','2002-09-12')" 

} 

sql="INSERT INTO cars (id,name,date) VALUES "+all_values.join(',') 

ActiveRecord::Base.connection.execute(sql) 

當我運行的代碼,它需要很長很長一段時間在large_data.each{...}點。其實我現在還在等它完成(已經跑了1個小時了還沒有完成large_data.each{...}部分)。

是否因爲紅寶石陣列的元素數量過大而導致陣列無法容納2,000,000元素?或紅寶石陣列可以容納這麼多元素,並且等待這麼長時間是合理的?

因爲我想用批量插入在SQL加快MySQL數據庫大數據插入時間,所以我想只用一個INSERT INTO聲明,這就是爲什麼我做了以上的事情。如果這是一個糟糕的設計,你能否以更好的方式推薦我?

+0

一個小問題:你離開的所有行之間的空行碼? – tokland

+0

你從哪裏得到這些數據?你爲什麼要將它從'large_data'移到'all_values'? –

回答

2

一些注意事項:

不要使用模式 「空數組+每+推」,使用Enumerable#map

all_values = large_data.map { |data| data[1] } 

是否可以寫get_data來退回物品?如果答案是肯定的,請檢查enumerators並使用它們批量插入到數據庫中,而不是一次放置所有對象。事情是這樣的:

def get_data 
    Enumerator.new do |yielder| 
    yielder.yield some_item 
    yielder.yield another_item 
    # yield all items. 
    end 
end 

get_data.each_slice(1000) do |data| 
    # insert those 1000 elements into the database 
end 

這就是說,有正在做有效的批量插入項目,檢查ar-extensionsactiverecord-import爲Rails> = 3

+0

你能否在我的情況下更詳細地使用地圖?爲什麼地圖更好,你的第二個鏈接被打破了。 – Mellon

+0

編輯更多的例子。我想你會明白爲什麼地圖更好,它專門爲這個任務設計,處理列表中的單個元素,這是功能性編程最基本的抽象之一:http://code.google.com/p/tokland/wiki/RubyFunctionalProgramming – tokland

+0

https://github.com/zdennis/activerecord-import是我知道在使用Rails> = 3時執行批量導入數據的最佳方式。 – cvshepherd

1

一個2米物品的數組永遠不會是易於管理的東西,你看看MongoDB,這是一個數據庫,可以像數組一樣訪問數據庫,並可以解決您的問題。

一個簡單的解決方法是將插入塊拆分爲1000塊,這將使整個過程更易於管理。