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
file. Saya tahu saya bisa 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 terjebak pada bagaimana memulai grep
dalam "mode multi-threaded" dan menulis output ke dalam satu output
file.
grep
parallelism
Abhishek
sumber
sumber
Jawaban:
Ada dua solusi mudah untuk ini. Pada dasarnya, menggunakan
xargs
atauparallel
.Pendekatan xargs:
Anda dapat menggunakan
xargs
denganfind
sebagai berikut:Di mana Anda akan mengganti
number_of_processes
dengan jumlah maksimum proses yang ingin Anda luncurkan. Namun, ini tidak dijamin untuk memberi Anda kinerja yang signifikan jika kinerja Anda terbatas I / O. Dalam hal ini Anda mungkin mencoba untuk memulai lebih banyak proses untuk mengkompensasi waktu yang hilang menunggu I / Os.Juga, dengan dimasukkannya find, Anda dapat menentukan opsi lebih lanjut 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 untukxargs
menentukan berapa banyak argumen yang harus diambil dari pipa sekaligus. Pengaturan-n1
akan memaksaxargs
untuk memulai proses baru untuk setiap file tunggal. Ini mungkin perilaku yang diinginkan jika file-file tersebut sangat besar (seperti dalam kasus pertanyaan ini) dan ada sejumlah kecil file. Namun, jika file itu sendiri kecil, overhead memulai proses baru dapat merusak keunggulan paralelisme, dalam hal ini-n
nilai yang lebih besar akan lebih baik. Dengan demikian,-n
opsi mungkin akan disesuaikan dengan ukuran dan jumlah file.Pendekatan Paralel:
Cara lain untuk melakukannya adalah dengan menggunakan alat Paralel Ole Tange GNU
parallel
, (tersedia di sini ). Ini menawarkan kontrol butir yang lebih baik atas paralelisme dan bahkan dapat didistribusikan melalui beberapa host (akan bermanfaat jika direktori Anda dibagikan misalnya). Sintaks paling sederhana menggunakan paralel adalah:find . -type f | parallel -j+1 grep mypattern
di mana opsi
-j+1
menginstruksikan paralel untuk memulai satu proses yang melebihi jumlah core pada mesin Anda (Ini dapat membantu untuk tugas-tugas terbatas I / O, Anda bahkan dapat mencoba untuk melangkah lebih tinggi jumlahnya).Paralel juga memiliki keunggulan dibandingkan
xargs
dengan benar-benar mempertahankan urutan output dari setiap proses dan menghasilkan output yang berdekatan. Misalnya, denganxargs
, jika proses 1 menghasilkan garis katakanp1L1
, proses 2 menghasilkan garisp2L1
, proses 1 menghasilkan garis lainp1L2
, hasilnya akan menjadi:sedangkan dengan
parallel
output harus:Ini biasanya lebih bermanfaat daripada
xargs
output.sumber
-n
kombinasi dengan-P
. Kalau tidak,xargs
mungkin tidak akan menghasilkan beberapa proses jika ada dua file.grep
per file. Kecuali file-file tersebut sangat besar dan jumlahnya sangat sedikit, Anda mungkin ingin meningkatkannya sedikit karena Anda akan menghabiskan waktu Anda memulai dan menghentikan proses grep daripada mencari dalam file.Setidaknya ada dua cara mempercepat grep dari segi CPU:
Jika Anda mencari string yang diperbaiki daripada ekspresi reguler, tentukan
-F
flagnya;Jika pola Anda hanya ASCII, gunakan lokal 8-bit alih-alih UTF-8, mis
LC_ALL=C grep ...
.Ini tidak akan membantu meskipun jika hard drive Anda adalah hambatan; dalam hal ini mungkin paralelisasi juga tidak akan membantu.
sumber
man grep
"Doa langsung karena egrep atau fgrep sudah usang, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung pada mereka untuk berjalan tanpa dimodifikasi." Tidak yakin ini benar-benar penting, tetapi sama dengangrep -F
Jika masalahnya bukan I / O terikat Anda bisa menggunakan alat yang dioptimalkan untuk pemrosesan multi-core.
Anda mungkin ingin melihat sift ( http://sift-tool.org , penafian: Saya penulis alat ini) atau pencari perak ( https://github.com/ggreer/the_silver_searcher ).
pencari perak memiliki batas ukuran file sebesar 2GB jika Anda menggunakan pola regex dan bukan pencarian string spimple.
sumber