GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Memulai Grep Multi-utas Di Terminal?

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:

Terkait:apa port yang diperlukan untuk dibuka di firewall?

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.


Linux
  1. Bagaimana Menyoroti Kata Dalam Output "kucing"??

  2. Bagaimana Cara Mengeluarkan File &Mengabaikan Baris Yang Dimulai Dengan "?"?

  3. Bagaimana cara mengurutkan keluaran ps berdasarkan waktu mulai proses?

  1. Bagaimana cara menerapkan filter ke output waktu nyata dari `tail -f`?

  2. Cara grep keluaran ps dengan header

  3. Cara meneruskan output perintah sebagai beberapa argumen ke perintah lain

  1. Cara Memulai Perintah Linux di Latar Belakang dan Melepaskan Proses di Terminal

  2. Cara memahami keluaran warna

  3. Bagaimana cara saya grep secara rekursif?