5

FOSElasticaBundle をインストールして、データの断面を操作しました。

私の問題は、インデックスを作成するために使用する必要がある行が約 1,400 万行あるという点で発生します。populate コマンドを実行したところ、昨日約 6 時間後に 10.8% でメモリ エラーが発生しました。

PHP Fatal error:  Allowed memory size of 2147483648 bytes exhausted (tried to allocate 52277 bytes) in /var/www/html/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php on line 111

ご覧のとおり、php のメモリ制限を 2G に設定しましたが、これはかなり過剰なはずです。

エラーの前の最後の行は次のようになりました

Populating index/entity, 10.8% (1315300/12186320), 36 objects/s (RAM : current=2045Mo peak=2047Mo)

そして、電流とピークは、30MB 前後から、すべての行で刻々と増加していました。

ここでの私の仮定は、ある種のメモリリークがあるということですか? 確かに、このプロセスによって php のメモリが使い果たされることはありません。また、いくつかの追加パラメーターを使用してコマンドを試しました

app/console fos:elastica:populate --no-debug --no-reset --env=prod

しかし、私がそれを実行しているのを見ると、現在のメモリはまだカチカチ音をたてています。

ここで何が起こっているのか、それをデバッグするために何ができるかについて何か考えはありますか? 私の問題のように聞こえるこの議論を見つけましたが、実際には良い解決策を提示していません: https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/82。私は教義とデフォルトのプロバイダーを使用しています。

ありがとうございました-

4

3 に答える 3

7

メモリリークを完全に解決することはできませんが、コマンドを実行することで

app/console fos:elastica:populate --no-debug --no-reset --env=prod --offset=n

バッチで入力できました。このページの解決策を使用して、ロガーをオフにすることで、メモリリークの量を大幅に削減しました

https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/273

PHP の memory_limit を 4G に設定すると (!)、エラーなしで 500 万件を超えるレコードを取得できます。

ほとんどのソリューションでは、カスタム プロバイダーを作成する必要があるようです ( https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/457を参照)。

于 2014-06-30T18:57:31.993 に答える