2017-04-11 13 views
0

私はクリーンアップと私は次のスクリプトを使用して、それらを必要とするどのようにファイルをフォーマットするCSVファイル(320メガバイト以上を超えなし)の一握りを反復処理しています:PHPスクリプトの実行中にメモリ割り当てエラーが発生するのはなぜですか?

while($row = mysqli_fetch_array($rsSelect)){   

    $fileName = $row["file_name"]; 

    if(strpos($fileName,'DATA') == true){ 

     $file = $dir.$row["manifest_files"].""; 
     echobr($file); 
     $file1 = file_get_contents($file, null); 

     unset($file); 
     $file2 = str_replace('","',' ', $file1); 

     unset($file1); 
     $file3 = str_replace('"','', $file2); 

     file_put_contents($dir.$row["file_name"].".txt",$file3,FILE_USE_INCLUDE_PATH); 
     unset($file2); 
     unset($file3); 

} 

私は関係なく、次のエラーが表示されません私はphp.ini内で私の記憶制限をどのくらい高く設定するか、メモリを解放することができる変数を設定解除します。私はスクリプト内の制限を設定しようとしたが、まだ行っていない。私のマシンにはRAMの不足がなく、必要なときにファイルを操作するときに簡単に保存することができます。

ERROR: (!) Fatal error: Out of memory (allocated 683147264) (tried to allocate 364322204 bytes)

+0

を' gc_collect_cyclesを追加unset')(; ' –

答えて

3

file_get_contents()を使用すると、ファイル全体が1つの大きなチャンクでメモリに読み込まれる必要があります。おそらく、fopen()とループを使ってfgets()を使った方が良いでしょう。これは一度に一つだけの行を読み込みます。また

$fp = fopen('file.csv', 'r'); 
while (($line = fgets($fp)) !== false) { 
    // $line is the whole line 
} 

、必要に応じてあなたがfgetcsv()を使用して、個々のフィールドを処理することができるかもしれません: `最後の後

$fp = fopen('file.csv', 'r'); 
while (($row = fgetcsv($fp)) !== false) { 
    // $row is an array of values from the line 
} 
+0

ああ、優れた説明!あなたのお返事ありがとうございますAlex Howasky – user2599674

関連する問題