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 elgrep
de 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 -r
con GNUgrep
má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).
-
grep
encuentra las líneas que coinciden con el patrón. Para eso, tiene que cargar una línea a la vez en la memoria. GNUgrep
a diferencia de muchos otrosgrep
Las 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-file
Ese 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 "