3,000 万もの膨大な文字列をメモリ不足にせずに処理するにはどうすればよいでしょうか?

Barbara Streisand
リリース: 2024-11-12 05:11:01
オリジナル
674 人が閲覧しました

How to Process a Massive 30 Million Character String Without Running Out of Memory?

3,000 万という膨大な文字列の分析

大量のデータを扱う場合、「メモリ不足」エラーが発生すると混乱する可能性があります。次のシナリオを考えてみましょう。curl を使用して約 3,050 万文字の CSV ファイルを取得しています。 r と n による分解などの一般的な方法を使用して、このデータを行の配列に分割しようとすると、恐ろしいメモリ割り当てエラーが発生します。ここで疑問が生じます: 大量のデータを効率的に操作しながら、このようなエラーを回避するにはどうすればよいですか?

メモリ割り当てエラーを回避するための戦略

前の回答で鋭敏に指摘したように:

  1. データセット全体をメモリに保存することを避ける: 3,000 万の文字列全体をメモリにロードする試みは本質的に非現実的です。
  2. CURLOPT_FILE を利用する:別のアプローチでは、curl の CURLOPT_FILE オプションを使用してデータをファイルに直接送信し、メモリ内に中間ストレージを必要とせずにリアルタイム処理を可能にします。

代替アプローチ: カスタム ストリーム ラッパーの採用

CURLOPT_FILE はデータをファイルに書き込むことで問題を効果的に解決しますが、特定のシナリオではメモリ内処理が必要になる場合があります。このような場合、カスタム ストリーム ラッパーを実装することで実行可能な解決策が得られます。

  1. ストリーム ラッパーの実装: stream_open() メソッドと stream_write() メソッドを定義するストリーム ラッパー クラスを定義します。
  2. 動的行抽出: stream_write() 内で、explode("n") を利用して、到着時にデータ チャンクから行を分離し、前のチャンクから引き継がれた不完全な行のバッファーを維持します。
  3. 処理を行う: stream_write()内で抽出した行に対して必要な処理を行います。これには、データの検証、フィルタリング、またはデータベースへの挿入が含まれる場合があります。

ストリーム ラッパーの例:

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $this->buffer = $lines[count($lines)-1];
        unset($lines[count($lines)-1]);

        // Perform your processing here
        var_dump($lines);
        echo '<hr />';

        return strlen($data);
    }
}
ログイン後にコピー

ストリーム ラッパーの登録:

stream_wrapper_register("test", "MyStream");
ログイン後にコピー

Curl との組み合わせ:

// Configure curl using CURLOPT_FILE
curl_setopt($ch, CURLOPT_FILE, fopen("test://MyTestVariableInMemory", "r+"));

// Execute curl to retrieve data from the source
curl_exec($ch);

// Close the stream
fclose($fp);
ログイン後にコピー

カスタム ストリーム ラッパーを採用することで、大きなデータ セットを管理可能なチャンクで処理することができます。メモリ割り当てエラー。この方法では、データが到着したときに処理できるため、効率的なメモリ使用が保証されます。

以上が3,000 万もの膨大な文字列をメモリ不足にせずに処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート