grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Ini telah berjalan selama satu jam di server linux yang cukup kuat yang sebaliknya tidak kelebihan beban. Ada alternatif lain selain grep? Apa pun tentang sintaks saya yang dapat ditingkatkan, (egrep, fgrep lebih baik?)
File tersebut sebenarnya ada di direktori yang dibagikan dengan mount ke server lain tetapi ruang disk sebenarnya adalah lokal sehingga seharusnya tidak ada bedanya?
grep mengambil hingga 93% CPU
-i
sakelar dapat memperlambat proses, coba tanpa-i
atau denganLC_ALL=C grep ...
. Selain itu, jika Anda hanya mencari string tetap, gunakangrep -F
.cindex .
untuk mengindeks folder Anda saat ini, lalucsearch db_pd.Clients
.Jawaban:
Berikut beberapa opsinya:
1) Awali perintah grep Anda dengan
LC_ALL=C
menggunakan lokal C, bukan UTF-8.2) Gunakan
fgrep
karena Anda mencari string tetap, bukan ekspresi reguler.3) Hapus
-i
opsi, jika Anda tidak membutuhkannya.Jadi perintah Anda menjadi:
Ini juga akan lebih cepat jika Anda menyalin file Anda ke disk RAM.
sumber
grep -F
lebih darifgrep
LANG=C
(daripadaLC_ALL=C
) sudah cukup, dan lebih mudah untuk mengetik.fgrep
adalah cara lain untuk menulisgrep -F
, seperti yangman fgrep
akan diberitahukan kepada Anda. Beberapa versiman
juga mengatakan bahwa yang pertama tidak digunakan lagi untuk yang terakhir, tetapi bentuk yang lebih pendek terlalu nyaman untuk mati.Jika Anda memiliki CPU multicore, saya sangat merekomendasikan GNU parallel . Untuk melakukan grep file besar secara paralel:
Bergantung pada disk dan CPU Anda, mungkin lebih cepat membaca blok yang lebih besar:
Ini tidak sepenuhnya jelas dari pertanyaan Anda, tetapi opsi lain untuk
grep
mencakup:-i
bendera.-F
bendera untuk string tetapLANG=C
-m
bendera.sumber
--pipepart
bukan--pipe
. Jauh lebih cepat.<
karakter yang mendahului perintah paralel?cat file.sql | parallel ...
tetapi menghindari UUOC . GNU paralel juga memiliki cara untuk membaca input dari file menggunakanparallel ... :::: file.sql
. HTH.Beberapa perbaikan sepele:
Hapus opsi -i, jika Anda bisa, case insensitive cukup lambat.
Ganti
.
dengan\.
Satu titik adalah simbol regex untuk mencocokkan karakter apa pun, yang juga lambat
sumber
Dua baris serangan:
-i
, atau apakah Anda memiliki kemungkinan untuk menyingkirkannya?grep
adalah single-threaded, jadi Anda mungkin ingin memulai lebih banyak di offset yang berbeda.sumber
Jika Anda perlu mencari beberapa string, grep -f strings.txt menghemat banyak waktu. Di atas adalah terjemahan dari sesuatu yang sedang saya uji. nilai opsi -j dan -n tampaknya bekerja paling baik untuk kasus penggunaan saya. -F grep juga membuat perbedaan besar.
sumber