Saya memiliki folder yang memiliki 250+ file masing-masing 2 GB. Saya perlu mencari string/pola dalam file-file itu dan menampilkan hasilnya dalam output
mengajukan. Saya tahu saya dapat menjalankan perintah berikut, tetapi terlalu lambat!!
grep mypattern * > output
Saya ingin mempercepatnya. Menjadi seorang programmer di Java, saya tahu multi-threading dapat digunakan untuk mempercepat proses. Saya bingung bagaimana memulai grep
dalam "mode multi-utas" dan tulis output ke dalam satu output
berkas.
Jawaban yang Diterima:
Ada dua solusi mudah untuk ini. Pada dasarnya, menggunakan xargs
atau parallel
.
Pendekatan xargs:
Anda dapat menggunakan xargs
dengan find
sebagai berikut:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Di mana Anda akan mengganti number_of_processes
dengan jumlah maksimum proses yang ingin Anda luncurkan.
Namun, ini tidak dijamin memberikan kinerja yang signifikan jika kinerja Anda terbatas pada I/O. Dalam hal ini Anda mungkin mencoba untuk memulai lebih banyak proses untuk mengkompensasi waktu yang hilang menunggu I/Os.
Selain itu, dengan penyertaan find, Anda dapat menentukan opsi yang lebih canggih daripada hanya pola file, seperti waktu modifikasi, dll ...
Satu kemungkinan masalah dengan pendekatan ini seperti yang dijelaskan oleh komentar Stéphane, jika ada beberapa file, xargs
mungkin tidak memulai cukup banyak proses untuk mereka. Salah satu solusinya adalah dengan menggunakan -n
opsi untuk xargs
untuk menentukan berapa banyak argumen yang harus diambil dari pipa pada suatu waktu. Menyetel -n1
akan memaksa xargs
untuk memulai proses baru untuk setiap file. Ini mungkin perilaku yang diinginkan jika file sangat besar (seperti dalam kasus pertanyaan ini) dan jumlah file yang relatif kecil. Namun, jika file itu sendiri kecil, biaya untuk memulai proses baru dapat merusak keuntungan paralelisme, dalam hal ini -n
yang lebih besar nilai akan lebih baik. Jadi, -n
opsi mungkin disesuaikan dengan ukuran dan nomor file.
Pendekatan Paralel:
Cara lain untuk melakukannya adalah dengan menggunakan alat Paralel Ole Tange GNU parallel
, (Tersedia disini). Ini menawarkan kontrol butiran halus yang lebih besar atas paralelisme dan bahkan dapat didistribusikan ke beberapa host (akan bermanfaat jika direktori Anda dibagikan misalnya).
Sintaks paling sederhana menggunakan paralel adalah:
find . -type f | parallel -j+1 grep mypattern
dimana pilihan -j+1
menginstruksikan paralel untuk memulai satu proses yang melebihi jumlah inti pada mesin Anda (Ini dapat membantu untuk tugas terbatas I/O, Anda bahkan dapat mencoba untuk meningkatkan jumlahnya).
Paralel juga memiliki keunggulan dibandingkan xargs
benar-benar mempertahankan urutan output dari setiap proses dan menghasilkan output yang berdekatan. Misalnya, dengan xargs
, jika proses 1 menghasilkan garis, katakan p1L1
, proses 2 menghasilkan baris p2L1
, proses 1 menghasilkan baris lain p1L2
, hasilnya adalah:
p1L1
p2L1
p1L2
sedangkan dengan parallel
outputnya harus:
p1L1
p1L2
p2L1
Ini biasanya lebih berguna daripada xargs
keluaran.