大きな CSV ファイルの効率的な操作: 3,000 万文字の文字列の処理
大きな CSV を操作すると「メモリ不足」エラーが発生するCurl 経由でダウンロードされたファイル。このファイルには約 3,050 万文字が含まれており、「r」と「n」を使用して行の配列に分割しようとすると、過剰なメモリ消費が原因で失敗します。割り当てエラーを回避するには、別のアプローチを検討してください:
ファイル書き込みなしのデータのストリーミング:
CURLOPT_FILE オプションを使用して、データを書き込む代わりにカスタム ストリーム ラッパーに直接ストリーミングします。ファイル。独自のストリーム ラッパー クラスを定義すると、過剰なメモリを割り当てずに、到着したデータのチャンクを処理できます。
ストリーム ラッパー クラスの例:
class MyStream { protected $buffer; function stream_open($path, $mode, $options, &$opened_path) { return true; } public function stream_write($data) { // Extract and process lines $lines = explode("\n", $data); $this->buffer = $lines[count($lines) - 1]; unset($lines[count($lines) - 1]); // Perform operations on the lines var_dump($lines); echo '<hr />'; return strlen($data); } }
ストリーム ラッパーの登録:
stream_wrapper_register("test", "MyStream") or die("Failed to register protocol");
ストリームによる設定カールラッパー:
$fp = fopen("test://MyTestVariableInMemory", "r+"); // Pseudo-file written to by curl curl_setopt($ch, CURLOPT_FILE, $fp); // Directs output to the stream
このアプローチにより、データのチャンクを段階的に処理できるため、メモリ割り当てが回避され、大きな文字列の操作が可能になります。
その他の考慮事項:
以上が3,000 万文字を含む大きな CSV ファイルを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。