Rumah > Artikel > pembangunan bahagian belakang > Mengapakah io.Copy() mencipta fail jarang yang besar, dan bagaimana anda boleh menyalinnya dengan cekap sambil mengekalkan jarangnya?
io.Copy() Mencipta Fail Jarang Besar: Panduan Komprehensif
Latar Belakang pada Kejarang Fail
io.Copy() beroperasi pada tahap bait, memindahkan data mentah antara aliran input dan output. Ia tidak mempunyai keupayaan untuk mengendalikan keterlaluan fail, yang merupakan teknik pengoptimuman untuk menyimpan data dengan cekap dengan mencipta lubang (kawasan kosong) dalam fail.
Cabaran dengan io.Copy()
Oleh itu, apabila menyalin fail jarang menggunakan io.Copy(), fail destinasi menjadi besar kerana tiada mekanisme untuk mengekalkan struktur lubang. io.Copy() memperlakukan fail jarang seolah-olah ia diisi dengan data, walaupun ia mengandungi kawasan kosong.
Penyelesaian Menggunakan Syscalls
Untuk mengatasi had ini, satu mesti memintas io.Copy() dan melaksanakan penyalinan fail secara manual menggunakan pakej syscall. Khususnya, nilai SEEK_HOLE dan SEEK_DATA harus digunakan bersama-sama dengan lseek(2) untuk mencari lubang dan data dalam fail sumber.
Pertimbangan Khusus Platform
The Nilai SEEK_HOLE dan SEEK_DATA berbeza-beza merentas platform, jadi adalah penting untuk menentukan nilai khusus mereka untuk sistem sasaran. Nilai ini boleh diperoleh daripada fail pengepala atau dokumentasi sistem. Sebagai contoh, sistem Linux biasanya mentakrifkan nilai ini dalam /usr/include/unistd.h.
Mencipta Fail Khusus Platform
Untuk memastikan keserasian platform, disyorkan untuk buat fail khusus platform yang mengandungi nilai SEEK_HOLE dan SEEK_DATA. Ini membolehkan pembangun bertukar dengan mudah antara platform yang berbeza tanpa mengubah suai kod teras.
Prosedur Membaca Fail Jarang
Apabila membaca fail yang jarang, kuncinya ialah mengenal pasti data- mengandungi wilayah dan membaca data dari kawasan tersebut. Ini melibatkan pencarian ke rantau data seterusnya menggunakan SEEK_HOLE dan kemudian membaca data sehingga mencapai lubang seterusnya menggunakan SEEK_DATA.
Memindahkan Fail Jarang
Memindahkan fail jarang sebagai jarang memerlukan langkah tambahan. Bergantung pada sistem fail sasaran, fallocate(2) boleh digunakan untuk membuat lubang dalam fail destinasi. Jika fallocate(2) tidak disokong, adalah mungkin untuk mengisi lubang dengan blok bersifar dan berharap sistem pengendalian menukarnya kepada lubang sebenar.
Pertimbangan Sistem Fail
Adalah penting untuk ambil perhatian bahawa sesetengah sistem fail tidak menyokong lubang. Jika sistem fail sasaran termasuk dalam kategori ini, anda tidak boleh membuat fail yang jarang menggunakan teknik ini.
Petua Tambahan
Atas ialah kandungan terperinci Mengapakah io.Copy() mencipta fail jarang yang besar, dan bagaimana anda boleh menyalinnya dengan cekap sambil mengekalkan jarangnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!