2012-05-09 8 views
2

大量のデータを含むcsvファイルを作成するPHPスクリプトをテストしています。 これは私がこの仕事のやり方です:私は、文字列($のcsvdata)が10万データ行スクリプトの作業罰金のように含まれているという通知を持って大量の文字列を扱うときにPHPスクリプトが機能しなくなる

$csvdata = "ID,FN,LN,ADDR,TEL,PRO\n 
      1,fn1,ln1,addr1,tel1,pro1\n...etc,"; 
$fname = "./temp/filename.csv"; 
$fp = fopen($fname,'w'); 
fwrite($fp,$csvdata); 
fclose($fp); 

を。しかし、それが約10,00,000個のデータ行を取得すると、$ csvdataという文字列を作成する途中で停止します(forループ内のデータを連結して$ csvdata文字列を作成しています)。

大きな文字列値を使用すると、何が問題になったのか教えてもらえますか?

ありがとう 種類は、私は、データベースからのループのために、データ内のデータを連結して$のcsvdata文字列を構築しています

+1

「ハング」のように「停止」しますか?または「クラッシュする」?または "エラーが出る"? – deceze

答えて

5

について。

ここから、ファイル全体を文字列として準備し、最終的にファイルに書き込むように準備しています。

もしそうなら、この方法は良くありません。文字列はメインメモリにあり、追加するたびにメモリを消費していることに注意してください。これは、データベースからレコードを読み込み、必要に応じて変換/書式設定し、CSV行を準備してファイルに書き込む行ごとにファイルを書き込むことです。

+0

ありがとうalad codaddict!その方法を試みます。 :) –

+0

私は解決策に同意します。また、すべての行のデータを書き込む実装に応じて、データを失うことなくurを確実に...他のケースでは、完全な文字列が構築されるのを待っている場合、データを失う可能性があります。 – swapnilsarwe

+0

@YasiruGamindaできます – swapnilsarwe

1

エラーログを確認してください。

  1. メモリを最大限まで割り当てようとしています。これはあなたがあまりにも多くのメモリを使用していることを意味します - >あなたが使用できるメモリの量を変更することができます(php.iniのメモリ制限)

  2. 実行時間は許容時間より長くなります。繰り返しますが、この時間を増やすことができます。

1

それはあなたのスクリプトは、おそらくMemory Exhaustedエラーを与え$csvdata=一部でなければなりません。

変数に10文字を保存すると、10ビットがかかり、その文字は大きくなり続けます。制限は割り当てられたメモリまたはPHPに達したときです。

だから、これはあなたが上に移動する方法です:

  1. セットメモリの制限 -

`ini_set( 'のmemory_limit'、 '256M')PHPのメモリ制限を増やします。ライン

によって

2.Write行は、ファイルへのデータの各部分を書くrightawayの代わりに、それらを積み上げ。また、配列[0]をファイルに書き込んだ後、次のデータを配列[1]に格納して再度書き込んでこれを続けると、今の場合と同じ結果になります。

だから、どちらか

while(blah blah){ 
$var = "text"; 
fwrite($file,$var); 

またはForループforループ

for($i=0;blahblah){ 
$var[$i] = "query"; 
fwrite($file,$var[$i]); 
unset($var); 

でのデータベースクエリがWHERE id='$i'

幸運と条件分岐しているときに便利です。

関連する問題