Saya melakukan pencarian yang sangat sederhana:
grep -R Milledgeville ~/Documents
Dan setelah beberapa waktu kesalahan ini muncul:
grep: memory exhausted
Bagaimana saya bisa menghindari ini?
Saya memiliki 10GB RAM pada sistem saya dan beberapa aplikasi berjalan, jadi saya benar-benar terkejut grep sederhana kehabisan memori. ~/Documents
sekitar 100GB dan berisi semua jenis file.
grep -RI
mungkin tidak memiliki masalah ini, tetapi saya ingin mencari dalam file biner juga.
sumber
grep
dapat membuang buffer yang telah diproses sejauh ini. Anda dapatgrep
outputyes
tanpa batas tanpa menggunakan lebih dari beberapa kilobyte memori. Masalahnya adalah ukuran garis.--null-data
Opsi grep GNU juga dapat berguna di sini. Ini memaksa penggunaan NUL alih-alih baris baru sebagai terminator jalur input.Saya biasanya melakukannya
Saya mencoba banyak metode, dan menemukan ini menjadi yang tercepat. Perhatikan bahwa ini tidak menangani file dengan spasi nama file dengan sangat baik. Jika Anda tahu ini masalahnya dan memiliki versi grep GNU, Anda dapat menggunakan:
Jika tidak, Anda dapat menggunakan:
Yang akan
exec
menjadi grep untuk setiap file.sumber
find -print0 | xargs -0 grep -ne 'expression'
find -print0
danxargs -0
sekarang: ketiga BSD, MINIX 3, Solaris 11,…Saya dapat memikirkan beberapa cara untuk mengatasi ini:
Alih-alih menangkap semua file sekaligus, lakukan satu file sekaligus. Contoh:
Jika Anda hanya perlu tahu file mana yang berisi kata-kata, lakukan
grep -l
saja. Karena grep akan berhenti mencari setelah klik pertama, itu tidak harus terus membaca file besarJika Anda ingin teks yang sebenarnya juga, Anda dapat merangkai dua greps terpisah:
sumber
grep
output menggunakan pembatas yang legal dalam nama file). Anda juga perlu mengutip$file
.for
proses file sebagai dua argumen)Saya sedang mengambil disk 6TB untuk mencari data yang hilang, dan memori habis - teror. Ini juga bisa digunakan untuk file lain.
Solusi yang kami temukan adalah dengan membaca disk di chunks dengan menggunakan dd, dan grepping chunks. Ini adalah kode (big-grep.sh):
sumber