Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Anda Menyalin Fail Jarang dengan Cekap Tanpa Kembung?

Bagaimana Anda Menyalin Fail Jarang dengan Cekap Tanpa Kembung?

Barbara Streisand
Barbara Streisandasal
2024-11-03 17:06:02644semak imbas

How Do You Efficiently Copy Sparse Files in Go Without Bloating?

Fail Jarang Kembung dengan io.Copy()

Dalam menyalin fail dengan io.Copy(), fail jarang yang besar cenderung mengembang secara tidak seimbang di destinasi mereka. Tingkah laku ini berpunca daripada pengendalian bait mentah io.Copy() yang tidak mempunyai cara untuk menyampaikan maklumat tentang lubang fail.

Mengendalikan Lubang

Untuk mengurus lubang , anda mesti mendalami pakej syscall dan bermain-main dengan nilai SEEK_HOLE dan SEEK_DATA untuk lseek(2). Malangnya, nilai ini tidak terdapat dalam pakej syscall standard atau rakan sejawatnya golang.org/x/sys.

Penyelesaian

Untuk mengatasinya, ikut langkah berikut:

  1. Peta syscall.Seek() ke lseek(2) pada platform yang disokong.
  2. Tentukan nilai yang betul untuk SEEK_HOLE dan SEEK_DATA untuk platform sasaran anda, kerana ia boleh berbeza-beza.

Sebagai contoh, pada Linux, anda boleh menggunakan:

// +build linux

const (
    SEEK_DATA = 3
    SEEK_HOLE = 4
)

Membaca dan Memindahkan Fail Jarang

Kesan kawasan data dan baca daripada mereka semasa membaca fail yang jarang. Untuk memindahkan fail dengan kejarang yang utuh, proses ini lebih terlibat dan memerlukan pertimbangan khusus platform.

Pendekatan Khusus Linux

Di Linux, gunakan fallocate(2) dengan FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE untuk menebuk lubang di hujung fail. Jika gagal, sodok blok sifar untuk menutup lubang.

Nota Tambahan

  • Sesetengah sistem fail, seperti FAT, tidak menyokong lubang.
  • Semak sama ada sumber dan destinasi berada pada sistem fail yang sama untuk mempertimbangkan menggunakan syscall.Rename() untuk pergerakan fail yang lebih pantas tanpa menyalin data.

Atas ialah kandungan terperinci Bagaimana Anda Menyalin Fail Jarang dengan Cekap Tanpa Kembung?. 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