Estaba haciendo una búsqueda muy simple:
grep -R Milledgeville ~/Documents
Y después de un tiempo apareció este error:
grep: memory exhausted
¿Cómo puedo evitar esto?
Tengo 10 GB de RAM en mi sistema y pocas aplicaciones ejecutándose, por lo que estoy realmente sorprendido de que un simple grep se quede sin memoria. ~/Documents tiene unos 100 GB y contiene todo tipo de archivos.
grep -RI Puede que no tenga este problema, pero también quiero buscar en archivos binarios.
Respuesta aceptada:
Dos problemas potenciales:
-
grep -R(excepto para elgrepde GNU modificado encontrado en OS/X 10.8 y superior) sigue los enlaces simbólicos, por lo que incluso si solo hay 100 GB de archivos en~/Documents, aún podría haber un enlace simbólico a/por ejemplo, y terminará escaneando todo el sistema de archivos, incluidos archivos como/dev/zero. Utilicegrep -rcon GNUgrepmás nuevo , o use la sintaxis estándar:find ~/Documents -type f -exec grep Milledgeville /dev/null {} +(Sin embargo, tenga en cuenta que el estado de salida no reflejará el hecho de que el patrón coincida o no).
-
grepencuentra las líneas que coinciden con el patrón. Para eso, tiene que cargar una línea a la vez en la memoria. GNUgrepa diferencia de muchos otrosgrepLas implementaciones no tienen un límite en el tamaño de las líneas que lee y admite la búsqueda en archivos binarios. Por lo tanto, si tiene un archivo con una línea muy grande (es decir, con dos caracteres de nueva línea muy separados), más grande que la memoria disponible, fallará.Eso normalmente sucedería con un archivo disperso. Puedes reproducirlo con:
truncate -s200G some-file grep foo some-fileEse es difícil de solucionar. Podrías hacerlo como (todavía con GNU
grep):buscar ~/Documentos -type f -exec sh -c 'for i do tr -s "