ホームページ  >  記事  >  バックエンド開発  >  3,000 万文字を含む大きな CSV ファイルを効率的に処理するにはどうすればよいですか?

3,000 万文字を含む大きな CSV ファイルを効率的に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-10 20:35:03515ブラウズ

How to Efficiently Process Large CSV Files with 30 Million Characters?

大きな 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。