2014-01-21 45 views
0

目前我的應用程序有統計需求和我如何確保使用find_in_batches時的正確性?

彌補後臺作業使用魯弗斯調度,並在3:00

運行,以批量處理這些記錄到CacheStat表。這就像

任何正常應用程序的每週/每月統計需求。

而且我發現使用find_each(說使用User.find_each迭代 所有用戶),它調用find_in_batches,我籤的源代碼軌道 ,

while records.any? 
    records_size = records.size 
    primary_key_offset = records.last.id 

    yield records 

    break if records_size < batch_size 

    if primary_key_offset 
     records = relation.where(table[primary_key].gt(primary_key_offset)).to_a 
    else 
     raise "Primary key not included in the custom select clause" 
    end 
    end 

其中implentation是通過比較主鍵, 我的問題是cocurrency,而我處理批處理, whatif一些記錄插入之間? 有沒有人有這種問題?

雖然我認爲,這個代碼實現可能是problemic,

,因爲新的記錄將始終有較大的PK,後來在

年底纔會發現。

所以這就是這種需求的實現?如果我想

我自己(無軌)實施一批統計處理,然後我

需要確保有一個整數的主鍵,並使用這些字段

比較(最好不要使用其他種田)?

(我想這是因爲我在從MySQL切換

到蒙戈中間是那種的,所以也許以後我需要自己實現這種

功能)。

回答

0

如果我理解正確,可以通過強制執行transactional isolation來確保正確性。

User.transaction do 
    User.find_each do |user| 
    user 
    end 
end 
+0

在交易中放置這麼大的東西真的很好,大多數基於統計的計算會迭代所有將有超過100萬份文件的表,交易是否真的很好?我原來使用find_each而不是User.all(將所有內容加載到內存中)是內存/ CPU使用率問題。 – femto

相關問題