首頁 >後端開發 >php教程 >如何在不超出記憶體限制的情況下處理巨大的字串?

如何在不超出記憶體限制的情況下處理巨大的字串?

Linda Hamilton
Linda Hamilton原創
2024-11-13 06:37:021098瀏覽

How to Process Huge Strings Without Exceeding Memory Limits?

操作字串超出記憶體限制

處理過大的字串時,例如3000 萬字元的CSV 文件,記憶體分配錯誤可以出現。要解決此問題,請不要將整個字串載入到記憶體中。相反,採用替代策略來處理資料而不超出記憶體限制。

替代方法:

  1. 利用 CURLOPT_FILE: 利用 CURLOPT_FILE選項與 CURL 結合指定資料應寫入的目標檔案。這種方法允許將資料直接寫入文件,避免記憶體限制。
  2. 建立自訂流包裝器:透過建立自訂流包裝器,您可以在資料到達時處理記憶體中的資料而不是將整個字串儲存在記憶體中。此方法使您能夠分塊處理數據,從而減少記憶體消耗。

使用流包裝器的範例實作:

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        // Has to be declared, it seems...
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $nb_lines = count($lines);
        $this->buffer = $lines[$nb_lines-1];
        unset($lines[$nb_lines-1]);
        var_dump($lines); // Process data as needed
        echo '<hr />';
        return strlen($data);
    }
}

// Register custom stream
stream_wrapper_register("test", "MyStream");

// Configure curl with target "file"
$fp = fopen("test://MyTestVariableInMemory", "r+");
curl_setopt($ch, CURLOPT_FILE, $fp); // Data will be sent directly to stream

curl_exec($ch);
curl_close($ch); // Don't forget to close file / stream
fclose($fp);

此策略可讓您處理資料在到達時遞增,避免記憶體分配問題。

以上是如何在不超出記憶體限制的情況下處理巨大的字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn