2

ファイル csv の値を次のように読み取ります。

 //$mypath . '/' . $filename <=> ../abc.csv
 $val = file_get_contents($mypath . '/' . $filename);                                       

 $escaped = pg_escape_bytea($val);

 $model->addFileImport($tmp, $data['email'], $escaped);

私のファイルは約100MBです。php.ini 設定: memory_limit = 128M

しかし、それでも:Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 133120 bytes) in...行にエラーが表示されます: $val = file_get_contents($mypath . '/' . $filename);

私は追加で修正しました ini_set('memory_limit', '-1');

 //$mypath . '/' . $filename <=> ../abc.csv
 ini_set('memory_limit', '-1');
 $val = file_get_contents($mypath . '/' . $filename);                                       

 $escaped = pg_escape_bytea($val);

 $model->addFileImport($tmp, $data['email'], $escaped);

しかし、それはエラーを示しています:

致命的なエラー: 112 行目の C:\wamp\www\joomlandk\components\com_servicemanager\views\i0701\view.html.php のメモリ不足 (割り当てられた 230686720) (657099991 バイトを割り当てようとしました)

並んで$escaped = pg_escape_bytea($val);

なんで?そのエラーをどのように修正しますか?

4

2 に答える 2

1

ドキュメントによると

pg_escape_bytea() は bytea データ型の文字列をエスケープします。エスケープされた文字列を返します。

bytea 型を SELECT すると、PostgreSQL は '\' で始まる 8 進数のバイト値を返します (例: \032 )。ユーザーは手動でバイナリ形式に変換する必要があります。

つまり、1 つの入力バイトが 4 バイト、つまり初期サイズの 4 倍になります。

ファイルを処理するには大量の RAM が必要です (PHP の制限がなくても、システムがそれほど多くのメモリを割り当てられない可能性があります)。解決策は、たとえばfread()およびfwrite()関数で作成された 40MB のチャンクから処理することです。

  $val = file_get_contents($mypath . '/' . $filename);

100MB かかるので、次の行は 400MB、合計 500MB かかります。一度に 20 (または 40) MB のみを読み取るように、*file_get_contents* から読み取る必要があるものを減らす必要があります。

  • (file_get_contents の代わりに) freadを使用して 20MB のファイルを読み取ります。
  • その 20MB を *pg_escape_bytea* で処理します (合計 100MB)
  • ファイルが完全に処理されるまでプロセスを繰り返します
于 2013-01-18T07:19:38.967 に答える
-1

追加してみてください:

ini_set('memory_limit', '700M');
于 2013-01-18T07:12:46.363 に答える