Pertimbangkan skenario berikut. Saya memiliki dua program A dan B. Output Program A ke stdout string, sedangkan program B memproses baris dari stdin. Cara menggunakan kedua program ini tentu saja:
foo @ bar: ~ $ A | B
Sekarang saya perhatikan bahwa ini memakan hanya satu inti; karenanya saya bertanya-tanya:
Apakah program A dan B berbagi sumber daya komputasi yang sama? Jika demikian, apakah ada cara untuk menjalankan A dan B secara bersamaan?
Hal lain yang saya perhatikan adalah bahwa A berjalan jauh lebih cepat daripada B, maka saya bertanya-tanya apakah bisa menjalankan lebih banyak program B dan membiarkan mereka memproses garis-garis yang dihasilkan A secara paralel.
Yaitu, A akan menampilkan baris-barisnya, dan akan ada N contoh program B yang akan membaca baris-baris ini (siapa pun yang membacanya pertama kali) memprosesnya dan mengeluarkannya di stdout.
Jadi pertanyaan terakhir saya adalah:
Apakah ada cara untuk menyalurkan output ke A di antara beberapa proses B tanpa harus menjaga kondisi ras dan inkonsistensi lain yang berpotensi timbul?
sumber
A | B | C
paralel seperti dalam proses terpisah, karena sifat pipa (B harus menunggu output dari A, C harus menunggu output dari B) mungkin masih linier dalam beberapa kasus. Ini sepenuhnya tergantung pada jenis output yang mereka hasilkan. Tidak banyak kasus di mana menjalankan banyakB
akan banyak membantu, sangat mungkin bahwa contoh wc paralel lebih lambat dari biasanyawc
karena pemisahan dapat mengambil lebih banyak sumber daya daripada menghitung garis normal. Gunakan dengan hati-hati.Jawaban:
Masalah dengan
split --filter
adalah bahwa output dapat digabungkan, sehingga Anda mendapatkan setengah garis dari proses 1 diikuti oleh setengah garis dari proses 2.GNU Parallel menjamin tidak akan ada mixup.
Jadi anggap Anda ingin melakukan:
Tapi B itu sangat lambat, dan dengan demikian Anda ingin memparalelkannya. Maka Anda dapat melakukan:
GNU Paralel secara default terbagi pada \ n dan ukuran blok 1 MB. Ini dapat disesuaikan dengan --recend dan --block.
Anda dapat menemukan lebih banyak tentang GNU Parallel di: http://www.gnu.org/s/parallel/
Anda dapat menginstal GNU Parallel hanya dalam 10 detik dengan:
Tonton video intro di http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
sumber
--block-size
akan tergantung pada jumlah RAM dan seberapa cepat Anda dapat memulai yang baruB
. Dalam situasi Anda, saya akan menggunakan--block 100M
dan melihat bagaimana itu dilakukan.sh
- sangat bagus. Masalahnya terletak pada meneruskannya ke sh: mengunduh dan menjalankan kode yang dapat dieksekusi dari sebuah situs . Pikiran Anda, mungkin saya hanya terlalu paranoid, karena orang bisa keberatan bahwa RPM atau DEB yang dibuat pada dasarnya adalah hal yang sama, dan bahkan memposting kode pada halaman yang akan disalin dan ditempelkan akan mengakibatkan orang melakukan hal itu secara membabi buta bagaimanapun.Saat Anda menulis
A | B
, kedua proses sudah berjalan secara paralel. Jika Anda melihatnya menggunakan hanya satu inti, itu mungkin karena salah satu pengaturan afinitas CPU (mungkin ada beberapa alat untuk menelurkan proses dengan afinitas berbeda) atau karena satu proses tidak cukup untuk menampung seluruh inti, dan sistem " lebih suka "tidak menyebar komputasi.Untuk menjalankan beberapa B dengan satu A, Anda memerlukan alat seperti
split
dengan--filter
opsi:Ini, bagaimanapun, bertanggung jawab untuk mengacaukan urutan garis dalam output, karena pekerjaan B tidak akan berjalan dengan kecepatan yang sama. Jika ini merupakan masalah, Anda mungkin perlu mengarahkan ulang keluaran ke-4 ke file perantara dan menjahitnya bersama-sama di akhir menggunakan
cat
. Ini, pada gilirannya, mungkin memerlukan ruang disk yang cukup besar.Pilihan lain ada (misalnya Anda bisa membatasi setiap contoh dari B ke output line-buffered tunggal, menunggu sampai seluruh "putaran" dari B telah selesai, jalankan setara dengan mengurangi untuk
split
's peta , dancat
output sementara bersama-sama), dengan berbagai tingkat efisiensi. Opsi 'round' yang baru saja dijelaskan misalnya akan menunggu instance B yang paling lambat selesai, jadi itu akan sangat tergantung pada buffering yang tersedia untuk B;[m]buffer
mungkin membantu, atau mungkin tidak, tergantung pada apa operasinya.Contohnya
Hasilkan 1000 angka pertama dan hitung garis secara paralel:
Jika kita "menandai" garis, kita akan melihat bahwa setiap baris pertama dikirim ke proses # 1, setiap baris kelima untuk memproses # 5 dan seterusnya. Selain itu, dalam waktu yang dibutuhkan
split
untuk menelurkan proses kedua, yang pertama sudah merupakan cara yang baik untuk kuota:Ketika mengeksekusi pada mesin 2-core
seq
,,split
danwc
proses berbagi core; tetapi melihat lebih dekat, sistem meninggalkan dua proses pertama pada CPU0, dan membagi CPU1 di antara proses pekerja:Perhatikan khususnya bahwa
split
memakan sejumlah besar CPU. Ini akan berkurang secara proporsional dengan kebutuhan A; yaitu, jika A adalah proses yang lebih berat daripadaseq
, overhead relatifsplit
akan berkurang. Tetapi jika A adalah proses yang sangat ringan dan B cukup cepat (sehingga Anda tidak perlu lebih dari 2-3 B untuk tetap bersama dengan A), maka memparalelkan dengansplit
(atau pipa pada umumnya) mungkin tidak sepadan.sumber
split
--filter
opsi yang hilang? Di Ubuntu 12.04-LTS ("wheezy / sid") saya, ada di sana, dan contoh saya berfungsi. Bisakah Anda menginstal yang berbedasplit
dari yang ada di GNU coreutils?