Memanipulasi Rentetan 30 Juta Aksara: Mengelakkan Ralat Peruntukan Memori
Menggunakan curl untuk mendapatkan suapan data CSV daripada vendor memberikan cabaran apabila memanipulasi saiz fail yang begitu besar. Pendekatan biasa untuk meletupkan kandungan oleh pemisah (cth., r dan n) mengakibatkan ralat "kehabisan ingatan" disebabkan saiz yang besar (kira-kira 30.5 juta aksara). Artikel ini meneroka penyelesaian alternatif untuk mengatasi masalah ini.
Walaupun tidak mungkin untuk menyimpan keseluruhan fail dalam ingatan, satu pilihan ialah menggunakan CURLOPT_FILE untuk mengubah hala kandungan ke dalam fail pada cakera. Walau bagaimanapun, pendekatan ini mungkin tidak sejajar dengan aliran kerja yang diingini, kerana ia melibatkan penciptaan fail fizikal.
Penyelesaian alternatif ialah untuk menentukan pembungkus strim tersuai, mendaftarkannya dan menggunakannya dan bukannya fail sebenar dengan CURLOPT_FILE . Pembalut strim ini boleh direka bentuk untuk memproses data dalam ketulan apabila ia tiba, mengelakkan isu peruntukan memori dengan cekap.
Untuk menggambarkan pendekatan ini, mari buat kelas MyStream yang memanjangkan kelas streamWrapper. Dalam kaedah stream_write, kita boleh mengeksploitasi fungsi explode untuk mengekstrak baris daripada ketulan data yang masuk. Memandangkan data biasanya diterima dalam ketulan yang lebih kecil (cth., 8192 bait), kami boleh mengendalikan bahagian yang lebih kecil ini daripada cuba memanipulasi keseluruhan fail sekali gus.
Dengan mendaftarkan pembungkus strim tersuai ini dengan protokol unik ( cth., "ujian") dan menggunakannya dalam konfigurasi curl dengan CURLOPT_FILE, kami boleh memanfaatkan kaedah stream_write untuk mengusahakan data secara berperingkat apabila ia diterima. Teknik ini membolehkan manipulasi rentetan besar yang cekap tanpa menyebabkan ralat peruntukan memori.
Atas ialah kandungan terperinci Bagaimana untuk Memanipulasi Rentetan 30 Juta Aksara Tanpa Kehabisan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!