2016-08-24 5 views
0

私は、このコマンドでhttps://github.com/Blogestudio/Fix-Serialization/blob/master/fix-serialization.phpPHP CLIは、メモリ

からフィックスserialization.phpファイルを使用して、1GBのSQLダンプを再シリアライズしようとしているが不足:

php -d memory_limit=-1 fix-serialization.php dump.sql 

しかし、私は次のエラーを取得します

PHP Fatal error: Out of memory (allocated 2328100864) (tried to allocate 18446744071742389167 bytes) 

私は私がしようとしたときと同じエラーを取得:

php -d memory_limit=2000M fix-serialization.php dump.sql 

明らかに私のコンピュータには18446744071GBのRAMがありません。私はMBPと私のUbuntuマシンの両方でこのエラーが発生していると私はphp5.6と7でこのスクリプトを実行しようとしました

+0

そのファイルを別の部分に分割することはできませんか? –

+0

ファイルを小さなセグメントに分割する - http://stackoverflow.com/a/28719267/2182349 – user2182349

答えて

1

あなた自身の解決策を見せてくれるように見えます。このスクリプトは、ファイル全体を一度に読み取ってから、ファイル全体をpreg_replaceに渡すため、適合しません。その正規表現は非常に複雑なので、大きな文字列を処理するためには多くのメモリが必要です。 read one data line、次にproccessとし、出力ファイルに書き込む必要があります。 Open読み込み用の入力ファイルと書き込み用の出力ファイルがあり、データが破損することはありません。

+0

ファイルを1行ずつ(同じスクリプト内で)読み込むと、メモリ使用量が減少しますか?だからメモリは、行ごとに正規表現を実行している間だけ割り当てられ、スクリプト全体のために累積されませんか? – rugbert

+0

はい、任意のサイズのファイルを開くと、ハンドルリソースに少量のメモリしか割り当てられません。行を読むと、そのデータは変数に格納されます。 –

+0

すごいですね。さて、私はちょうどその正規表現を取って、1行ごとにダンプに対して実行してみましょう。 – rugbert