Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memproses Rentetan 30 Juta Aksara Besar-besaran Tanpa Kehabisan Memori?

Bagaimana untuk Memproses Rentetan 30 Juta Aksara Besar-besaran Tanpa Kehabisan Memori?

Barbara Streisand
Barbara Streisandasal
2024-11-12 05:11:01674semak imbas

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

Menganalisis Rentetan 30 Juta Aksara Besar

Pertemuan dengan ralat "kehabisan ingatan" boleh membingungkan apabila berurusan dengan volum data yang besar. Pertimbangkan senario ini: anda mendapatkan semula fail CSV sekitar 30.5 juta aksara menggunakan curl. Percubaan untuk membedah data ini ke dalam tatasusunan baris menggunakan kaedah biasa seperti meletup dengan r dan n mencetuskan ralat peruntukan memori yang ditakuti. Ini menimbulkan persoalan: bagaimana untuk mengelakkan ralat sedemikian sambil memanipulasi data yang luas dengan cekap?

Strategi untuk Mengelak Ralat Peruntukan Memori

Seperti yang ditunjukkan dengan bijak dalam respons sebelumnya:

  1. Elakkan Menyimpan Keseluruhan Set Data dalam Memori: Percubaan untuk memuatkan keseluruhan 30 juta rentetan aksara ke dalam ingatan sememangnya tidak praktikal.
  2. Leverage CURLOPT_FILE: Pendekatan alternatif melibatkan penggunaan pilihan CURLOPT_FILE curl untuk mengarahkan data terus ke fail , membolehkan pemprosesan masa nyata tanpa memerlukan storan perantaraan dalam memori.

Pendekatan Alternatif: Menggunakan Pembungkus Strim Tersuai

Walaupun CURLOPT_FILE berkesan menyelesaikan isu dengan menulis data pada fail, senario tertentu mungkin memerlukan dalam- pemprosesan ingatan. Dalam kes sedemikian, melaksanakan pembalut strim tersuai menyediakan penyelesaian yang berdaya maju.

  1. Pelaksanaan Pembalut Strim: Tentukan kelas pembalut strim yang mentakrifkan kaedah stream_open() dan stream_write().
  2. Pengeluaran Garis Dinamik: Dalam stream_write(), gunakan explode("n") untuk mengasingkan baris daripada ketulan data apabila ia tiba, mengekalkan penimbal untuk baris yang tidak lengkap dibawa balik daripada ketulan sebelumnya.
  3. Lakukan Pemprosesan: Kelakuan yang perlu pemprosesan pada baris yang diekstrak dalam stream_write(). Ini mungkin melibatkan pengesahan, penapisan atau memasukkan data ke dalam pangkalan data.

Contoh Pembungkus Strim:

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);
    }
}

Mendaftarkan Pembungkus Strim :

stream_wrapper_register("test", "MyStream");

Menggabungkan dengan 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);

Dengan menggunakan pembalut strim tersuai, anda boleh memproses set data yang besar dalam bahagian yang boleh diurus tanpa menghadapi ralat peruntukan memori. Kaedah ini membolehkan data diproses apabila ia tiba, memastikan penggunaan memori yang cekap.

Atas ialah kandungan terperinci Bagaimana untuk Memproses Rentetan 30 Juta Aksara Besar-besaran Tanpa Kehabisan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn