Apakah Unix grep bekerja lebih cepat dengan istilah pencarian panjang atau pendek?

8

Apakah lebih cepat mencari istilah pencarian panjang atau pendek? Atau apakah itu mempengaruhi kecepatan sama sekali? Dengan kata lain, haruskah Anda membuat istilah pencarian setepat mungkin?

Ada lebih dari 100.000 file dan setiap file berisi antara 20 dan lebih dari 5.000 baris data. Biasanya grep digunakan untuk menemukan hanya satu contoh dari istilah pencarian.

Katakanlah istilah pencariannya adalah SEARCHTERM, dan itu akan menjadi baris seperti ini:

NAD+DP+1234567890:92++UNIQUE+NAME+SEARCHTERM++12345+FI'

Apakah lebih cepat mencari "SEARCH" atau "SEARCHTERM"? Katakanlah dalam hal ini kami tidak peduli jika kami juga menemukan kecocokan di jalur lain yang tidak terkait.

Inilah cara saya saat ini melakukannya:

grep NAD+DP 123* | grep SEARCHTERM

Tapi saya merasa ini cukup lambat. Biasanya butuh sekitar 3-5 menit untuk menemukan data, bahkan ketika saya tahu nama file kasar, yang membatasi jangkauan hingga sekitar 10.000 file.

Jadi, akankah istilah pencarian yang lebih panjang atau lebih pendek membantu? Sejauh yang saya tahu, grep mencari "blok" kata-kata dengan panjang tertentu?

Juha Untinen
sumber

Jawaban:

8

Beberapa bahan referensi:

GNU grep menggunakan algoritma Boyer-Moore yang terkenal, yang terlihat pertama kali untuk huruf terakhir dari string target, dan menggunakan tabel pencarian untuk mengetahui seberapa jauh ia dapat melewatkan input kapan pun ia menemukan karakter yang tidak cocok.

dari Why GNU grep cepat .

Algoritme memproses ulang string yang dicari (pola), tetapi bukan string yang dicari (teks). [...] Secara umum, algoritma berjalan lebih cepat seiring meningkatnya panjang pola.

dari algoritma pencarian string Boyer – Moore .

Kesimpulan: Gunakan string yang lebih panjang .

Sekarang, sedikit tolok ukur untuk bersenang-senang:

# Initialisation
cd $(mktemp -d) && dd if=/dev/urandom of=random bs=1M count=1000
# Version
grep --v` # grep (GNU grep) 2.9
# Benchmark
(for s in 'short' 'this is not so short and we could even consider this as pretty long'; do for t in {1..10}; do time grep "$s" random; done; done ) 2> result

Hasil: 0,952s adalah rata-rata untuk string pendek, 0,244s adalah rata-rata untuk string panjang.

NB : Panjangnya bukan satu-satunya kriteria yang harus diperhitungkan.

SylvainD
sumber
0

Anda dapat mencoba sendiri menggunakan SEARCH atau SEARCHTERM. Coba juga mengubah urutan kedua perintah grep. Pokoknya satu-satunya pilihan yang bermanfaat adalah kemungkinan besar akan menggunakan beberapa core CPU untuk satu pencarian. Lihat parallelperintahnya.

golimar
sumber
0

Saya tidak berpikir menentukan istilah pencarian yang lebih spesifik akan membuatnya terasa lebih cepat.

Dengan begitu banyak file yang harus dicari, Anda perlu mengindeks data Anda untuk membuat pencarian lebih cepat.

Saya dapat menyarankan beberapa cara:

  • Buat basis data (PostgreSQL atau MySQL), impor data Anda ke dalam basis data - satu file dalam satu baris, tambahkan indeks FTS (pencarian teks lengkap). Buat beberapa utilitas untuk query database.

  • Impor data ke dalam basis data dengan cara yang lebih terperinci, mungkin satu baris ke satu baris (atau mungkin lebih dari satu tabel), buat indeks sedemikian rupa sehingga data Anda dapat dicari dengan menggunakan indeks. Buat beberapa utilitas untuk query database.

  • Tambahkan file Anda ke dalam gitrepositori, pampatkan menggunakan git gc, gunakan git grepuntuk mencari. Dalam pengalaman saya, git grepbisa lebih cepat dari standar grepdengan faktor 10x-100x.

mvp
sumber
0

Logikanya, jangka waktu yang lebih pendek akan membutuhkan lebih sedikit waktu CPU, seperti yang grepakan dilakukan

if (filechar[i] == pattern[i]) ...

lebih sedikit kali. Pada kenyataannya, saya akan menebak bahwa grepakan I / O-terikat dan tidak terikat CPU, jadi itu tidak masalah.

Scott
sumber
1
Cukup mengejutkan, ini salah karena grep menggunakan algoritma yang sangat cerdas, silakan merujuk ke jawaban saya.
SylvainD
semakin lama string pencarian, semakin banyak karakter yang dapat dilewati ketika menemukan ketidakcocokan, maka pencarian akan lebih cepat
phuclv