我正在尋找將大量物件(1M 實體)轉換為另一種物件型別的最有效方法。不幸的是,我無法選擇我所獲得的作為輸入(百萬物件)。
到目前為止,我已經嘗試過,each_slice但沒有顯示出太大的改進!
它看起來像這樣:
expected_objects_of_type_2 = []
huge_array.each_slice(3000) do |batch|
batch.each do |object_type_1|
expected_objects_of_type_2 << NewType2.new(object_type_1)
end
end
任何的想法?
謝謝!
uj5u.com熱心網友回復:
我使用幾種不同的回圈陣列方法進行了快速測驗并測量了時間:
huge_array = Array.new(10000000){rand(1..1000)}
a = Time.now
string_array = huge_array.map{|x| x.to_s}
b = Time.now
puts b-a
同:
sa = []
huge_array.each do |x|
sa << x.to_s
end
和
sa = []
huge_array.each_slice(3000) do |batch|
batch.each do |x|
sa << x.to_s
end
end
不知道你在轉換什么,所以我做了一些簡單的 int 到 string。
時間安排
Map: 1.7
Each: 2.3
Slice: 3.2
所以顯然你的切片開銷讓事情變慢了。Map 似乎是最快的(內部只是一個 for 回圈,但輸出的是非動態長度陣列)。這<<似乎讓事情變慢了一點。
因此,如果每個物件都需要一個單獨的轉換,您就會陷入 O(n) 復雜性并且無法大大加快速度。只是避免開銷。
根據您的資料,如果您有大量相同的資料,排序和利用快取效果可能有助于或避免重復,但我們無法知道我們是否不知道您的實際轉化。
uj5u.com熱心網友回復:
我會在自己的執行緒中處理每個切片:
huge_array.each_slice(3000) do |batch|
Thread.new do
batch.each do |object_type_1|
expected_objects_of_type_2 << NewType2.new(object_type_1)
end
end
end
然后您必須等待執行緒使用join. 它們應該累積在一個陣列中并加入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/314054.html
