2014-01-14 52 views
5

所以我一直在試着用laravel的口頭語言,但我遇到了一個問題。考慮下面的代碼(我的問題的更簡化的版本):Laravel chunking不會減少PHP的內存使用量

$data = DB::connection('mydb')->table('bigdata') 
->chunk(200, function($data) { 
    echo memory_get_usage(); 
    foreach($data as $d) { 
    Model::create(
     array(
     'foo' => $d->bar, 
     ... 
     //etc 
    )); 
    } 
} 

所以,當我運行下面的代碼我的記憶輸出是這樣的:

19039816 
21490096 
23898816 
26267640 
28670432 
31038840 

因此,沒有跳進php.ini和改變memory_limit值的任何線索爲什麼它不工作?根據文檔:「如果你需要處理很多(千次)雄辯記錄,使用塊命令將允許你不用吃掉所有的RAM」。

我試過unset($data)之後的foreach函數,但它沒有幫助。我有什麼線索可以利用chunk或者我誤解了它的作用?

+2

好的,在我們的查詢解決我們的問題之前,稍加挖掘一下'DB :: disableQueryLog()'就可以了。 – tiffanyhwang

+0

當你發現你自己時,查詢記錄正在消耗內存。有了這個說法,你也可以在構造函數中調整單個類的內存限制,如下所示:'ini_set('memory_limit',$ this-> memorylimit);' – nielsiano

+0

使用Laravel調試條獲得更好的洞察力 –

回答

0

塊數據不會減少內存使用量,您需要像分頁直接使用數據庫那樣來完成。

就像第一次獲取由id或其他內容開始的200個訂單一樣,並且在處理第一個200之後,再次用where子句詢問下一個200個結果來觸發該查詢。