我有幾個數據庫管理任務需要經過數據庫中的每條記錄。這是我的理解是與CakePHP的ORM 3.x的,我可以做這樣的事情,它會永遠只能在內存中有一條記錄時間:每次讀取記錄時內存使用量都會增加
$records = TableRegistry::get('Whatever')->find();
foreach ($records as $record) {
// do some processing
}
然而,這最終有崩潰「內存不足「的例外。我已經添加了一些memory_get_peak_usage
的日誌記錄,並且每次迭代都會增加,即使除了foreach循環內發生的日誌記錄之外沒有其他任何內容。循環中每次增加約12K。
我正在運行3.2.7,並且結果類似,無論我是否啓用了調試和/或SQL日誌記錄。將頻繁撥打的電話添加到gc_collect_cycles()
只會降低過程速度,這對內存使用量沒有幫助。
這是預計,或者一個錯誤?如果前者,有什麼我可以以不同的方式在這個代碼,以防止它? (很顯然,我可以小批量處理它,但這不是一個很好的解決方案。)
您是否嘗試過關閉[**結果緩衝**](http://book.cakephp.org/3.0/en/orm/retrieving-data -and-resultsets.html#工薪與對結果集)? – ndm
@ndm,聽起來很有希望,所以我跑了幾個快速測試,但有些奇怪的是似乎顯示內存使用增加*更快*緩衝關閉。完全可能的是,我在測試中做了錯誤的測試......其他測試崩潰了,告訴我「在其他未緩衝的查詢處於活動狀態時無法執行查詢」,這對我來說可能是一種破壞行爲,在這種情況下。我將不得不考慮這個問題,看看是否有解決方案,對代碼的干擾性小於運行我需要小批量處理的大查詢。 –