大量の(巨大な)データを管理(エクスポート)する必要があるphpアプリケーションがあり、本番環境で実行する必要があります...したがって、メモリ使用量をできるだけ少なくする必要があります(主な基準)。
次のように、アプリがサイクルでデータをエクスポートすると簡単に言います
for($fileCounter=0;$fileCounter<=70;$fileCounter++) {
... HERE a lot of (more than 1K lines) huge work, many variables a lot of DB queries from another databases etc ...
}
他の人にとっては時間がかかる可能性があるため、ここで完全なロジックを示したくはありません。ここでは要点ではありません。
主なポイントは、unset()
各反復中にすべての新しく作成された変数を使用すると、メモリ使用量が減少しないのはなぜですか? このような
for($fileCounter=0;$fileCounter<=70;$fileCounter++) {
// optimization purpose
$vars_at_start = array_keys(get_defined_vars());
echo memory_get_peak_usage(true) . PHP_EOL;
... huge logic ...
$vars_at_end = array_diff($vars_at_start, array_keys(get_defined_vars()));
foreach($vars_at_end as $v) unset($v);
unset($vars_at_end);
}
どうすればメモリ使用量を減らすことができますか? 非常に多くのクエリ、変数などを使用する必要がある場合..
PSコードは私のものではありません:)そして、ゼロから書き直したくありません。最適化の方向性を探しているだけです。
変数を使用しない場合、次はメモリ使用量をクリーニングします(各反復の最初に測定しています)
23592960
Started: 0 - 12:58:26
Ended: 13:00:51
877920256 (difference 854'327'296)
Started: 1 - 13:00:51
Ended: 13:03:39
1559494656 (difference 681'574'400)
と変数のクリーニング
23592960
Started: 0 - 12:47:57
Ended: 12:50:20
877920256 (difference 854'327'296)
Started: 1 - 12:50:20
Ended: 12:53:16
1559756800 (difference 681'836'544)
私の読書に基づいて、PHPにはメモリをリークする多くの理由があります...このようにhttps://bugs.php.net/bug.php?id=48781
それが役立つvalgrindと呼ばれるツールがあります。それを試してみてください:)