データベースのすべてのレコードを処理する必要があるデータベース管理タスクがいくつかあります。これは、CakePHPのの3.x ORMで、私はこのような何かを行うことができることを私の理解であり、それは今まで一度にメモリ内の1つのレコードを持っているでしょう:「レコードの読み取りごとにメモリ使用量が増加する
$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#working-with-result-sets)? – ndm
@ndm、それは有望だったので、私はいくつかの簡単なテストを実行しましたが、いくつかのバッファがオフになってメモリ使用量が*高速に*増加しているように思われました。私のテストで何かが間違っていた可能性があります...他のテストがクラッシュし、 "他のバッファリングされていないクエリがアクティブな間にクエリを実行できません"と言いました。私はそれについて考える必要があり、小規模なバッチで行う必要がある大きなクエリを実行するよりも、コードへの影響が少ないソリューションがあるかどうかを確認する必要があります。 –