Saya memiliki daftar file yang perlu saya salin di sistem Linux - masing-masing file berukuran dari 10 hingga 100GB.
Saya hanya ingin menyalin ke sistem file lokal. Apakah ada cara untuk melakukan ini secara paralel - dengan beberapa proses yang masing-masing bertanggung jawab untuk menyalin file - secara sederhana ?
Saya dapat dengan mudah menulis program multithreaded untuk melakukan ini, tetapi saya tertarik untuk mencari tahu apakah ada metode Linux tingkat rendah untuk melakukan ini.
Jawaban:
Jika sistem Anda tidak diremukkan olehnya (mis. Mungkin file-file itu ada dalam cache) maka GNU Parallel http://www.gnu.org/software/parallel/ dapat bekerja untuk Anda:
Ini akan menjalankan 10 bersamaan
cp
.Pro: Mudah dibaca.
Con: GNU Parallel tidak standar pada kebanyakan sistem - jadi Anda mungkin harus menginstalnya.
Tonton video intro untuk info lebih lanjut: http://www.youtube.com/watch?v=OpaiGYxkSuQ
Lihat juga https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ untuk pembahasan disk paralel I / O.
sumber
Tidak ada mekanisme tingkat rendah untuk ini karena alasan yang sangat sederhana: melakukan ini akan merusak kinerja sistem Anda. Dengan platter drive, masing-masing tulisan akan bersaing untuk penempatan kepala, yang mengarah ke menunggu I / O besar-besaran. Dengan SSD, ini akan menjenuhkan satu atau lebih bus sistem Anda, menyebabkan masalah lain.
sumber
Seperti yang disebutkan, ini adalah ide yang mengerikan. Tapi saya percaya semua orang harus dapat mengimplementasikan rencana mengerikan mereka sendiri, sooo ...
for FILE in *;do cp $FILE <destination> &;done
Tanda bintang dapat diganti dengan ekspresi reguler file Anda, atau
$(cat <listfile>)
jika Anda memiliki semuanya dalam dokumen teks. Ampersand memulai perintah di latar belakang, sehingga loop akan berlanjut, menghasilkan lebih banyak salinan.Seperti yang disebutkan, ini akan sepenuhnya memusnahkan IO Anda. Jadi ... saya benar-benar tidak akan merekomendasikan melakukannya.
--Christopher Karel
sumber
Satu-satunya jawaban yang tidak akan membuang respons mesin Anda bukanlah 'salinan', tetapi ini sangat cepat. Jika Anda tidak akan mengedit file di lokasi baru atau lama, maka tautan keras secara efektif seperti salinan, dan (hanya) jika Anda berada di sistem file yang sama, mereka dibuat sangat sangat sangat cepat.
Lihat
cp -l
dan lihat apakah itu akan berhasil untuk Anda.sumber
Berikut adalah alat salin file terdistribusi / paralel dan terdesentralisasi yang akan memotong file dan menyalin semua potongan secara paralel. Ini mungkin hanya akan membantu Anda jika Anda memiliki SSD yang mendukung banyak aliran atau semacam pengaturan dengan beberapa kepala disk.
https://github.com/hpc/dcp
sumber
Bagi orang-orang yang berpikir itu bukan ide yang bagus, saya akan mengatakan itu tergantung. Anda dapat memiliki sistem serangan besar atau sistem file paralel yang akan memberikan kinerja yang benar-benar lebih baik daripada yang dapat ditangani oleh satu proses cp. Maka ya, Anda perlu menggunakan "alat paralel".
Mari kita ambil contoh ini:
lalu ini
jadi setiap syscall write dibuat oleh "cp" dalam hal ini adalah 64KiB dan untuk 10s pada sistem saya, saya dapat memberikan bandwidth ini: 65536 * 166222/10 = 1089352499 = ~ 1,08GB / s
Sekarang, mari kita luncurkan beban kerja ini dengan 2 proses (Saya memiliki 4 inti tetapi desktop saya digunakan untuk hal-hal lain, dan ini hanya sebuah contoh):
Jadi kami melihat kami dapat hampir menggandakan kinerja menggunakan 2 inti untuk meluncurkan ini.
Jadi jika kita berada dalam konteks yang berbeda dari drive 1xHard ke drive 1xHard tetapi array raid (atau beberapa NVMe jadi bukan kasus yang paling umum saya setuju tapi saya bekerja pada ini setiap hari), itu menunjukkan kinerja yang lebih baik untuk menggunakan multiple common di paralel.
sumber
Anda harus mencoba ini:
Ini akan menyalin file passwd 3 kali dari / etc / direktori ke $ HOME Anda
Atau jika file Anda ada di direktori home Anda
Ini akan menyalin file passwd 3 kali ke $ HOME Anda
sumber