2

大量のデータを含むcsvファイルを作成するために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);

文字列($ csvdata)に100,000行のデータ行が含まれている場合、スクリプトは正常に機能することに気付きました。しかし、10,00,000を超えるデータ行を取得すると、文字列$ csvdataを作成する途中で停止します(forループ内のデータ、データベースからのデータを連結して$ csvdata文字列を作成しています)。

大きな文字列値を使用すると何がうまくいかなかったのか誰かに教えてもらえますか?

よろしくお願いします

4

3 に答える 3

5

データベースからのデータを for ループで連結して $csvdata 文字列を作成しています。

このことから、ファイル全体を文字列として書き込む準備をしていて、最終的にファイルに書き込んでいることがわかります。

もしそうなら、このアプローチは良くありません。文字列はメイン メモリに存在し、追加するたびにより多くのメモリを消費することに注意してください。これを修正するには、データベースからレコードを読み取るファイルを行ごとに書き込み、必要に応じて変換/フォーマットし、CSV 行を準備してファイルに書き込みます。

于 2012-05-09T07:19:16.413 に答える
1

エラーログを確認してください。それはおそらく何かを言うでしょう

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

  2. 実行時間が許容時間を超えています。今回も増量可能です。

于 2012-05-09T07:19:55.230 に答える
1

スクリプトがおそらくエラー$csvdata=を出す部分にあるはずです。Memory Exhausted

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

だから、これはあなたが進む方法です:

  1. メモリ制限の設定 - PHP のメモリ制限を増やします

`ini_set('memory_limit', '256M');

2.一行ずつ書く

データを積み上げるのではなく、各データをすぐにファイルに書き込みます。また、ファイルに array[0] を書き込んでから、次のデータを array[1] に格納し、もう一度書き込んでこれを続けると、今行っていることと同じ効果が得られます。

だからどちらか

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

またはforループで

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

for ループは、データベース クエリが次のような条件付きの場合に便利です。WHERE id='$i'

幸運を。

于 2012-05-09T07:33:49.153 に答える