Memanipulasi Fail CSV Besar dengan Cekap: Mengendalikan Rentetan 30 Juta Aksara
Anda menghadapi ralat 'kehabisan ingatan' semasa memanipulasi CSV yang besar fail dimuat turun melalui Curl. Fail itu mengandungi kira-kira 30.5 juta aksara, dan percubaan untuk membahagikannya kepada tatasusunan baris menggunakan "r" dan "n" gagal kerana penggunaan memori yang berlebihan. Untuk mengelakkan ralat peruntukan, pertimbangkan pendekatan alternatif:
Penstriman Data tanpa Penulisan Fail:
Gunakan pilihan CURLOPT_FILE untuk menstrim data terus ke dalam pembungkus strim tersuai dan bukannya menulis ke sebuah fail. Dengan menentukan kelas pembalut strim anda sendiri, anda boleh memproses sebahagian daripada data apabila ia tiba tanpa memperuntukkan memori yang berlebihan.
Contoh Kelas Pembalut Strim:
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); } }
Daftarkan pembalut strim:
stream_wrapper_register("test", "MyStream") or die("Failed to register protocol");
Keriting Konfigurasi dengan pembalut strim:
$fp = fopen("test://MyTestVariableInMemory", "r+"); // Pseudo-file written to by curl curl_setopt($ch, CURLOPT_FILE, $fp); // Directs output to the stream
Pendekatan ini membolehkan anda mengusahakan ketulan data secara berperingkat, mengelakkan peruntukan memori dan menjadikannya layak untuk beroperasi pada rentetan besar.
Pertimbangan Lain:
Atas ialah kandungan terperinci Bagaimana untuk Memproses Fail CSV Besar dengan Cekap dengan 30 Juta Aksara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!