Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah io.Copy() mencipta fail jarang yang besar, dan bagaimana anda boleh menyalinnya dengan cekap sambil mengekalkan jarangnya?

Mengapakah io.Copy() mencipta fail jarang yang besar, dan bagaimana anda boleh menyalinnya dengan cekap sambil mengekalkan jarangnya?

Susan Sarandon
Susan Sarandonasal
2024-10-30 06:32:27606semak imbas

Why does io.Copy() create large sparse files, and how can you efficiently copy them while preserving their sparseness?

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

  • Pertimbangkan untuk menggunakan os.Rename() untuk mengalihkan fail dalam sistem fail yang sama, mengelakkan keperluan untuk menyalin.
  • Rujuk isu Go #13548 untuk mendapatkan maklumat lanjut tentang mencipta fail tar yang jarang.

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!

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