Je faisais une recherche très simple :
grep -R Milledgeville ~/Documents
Et après un certain temps, cette erreur est apparue :
grep: memory exhausted
Comment puis-je éviter cela ?
J'ai 10 Go de RAM sur mon système et peu d'applications en cours d'exécution, donc je suis vraiment surpris qu'un simple grep manque de mémoire. ~/Documents
est d'environ 100 Go et contient toutes sortes de fichiers.
grep -RI
peut-être pas ce problème, mais je veux aussi chercher dans les fichiers binaires.
Réponse acceptée :
Deux problèmes potentiels :
-
grep -R
(sauf pour le GNU modifiégrep
trouvé sur OS/X 10.8 et supérieur) suit les liens symboliques, donc même s'il n'y a que 100 Go de fichiers dans~/Documents
, il peut toujours y avoir un lien symbolique vers/
par exemple et vous finirez par analyser l'ensemble du système de fichiers, y compris des fichiers comme/dev/zero
. Utilisezgrep -r
avec le nouveau GNUgrep
, ou utilisez la syntaxe standard :find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(notez cependant que le statut de sortie ne reflétera pas le fait que le modèle corresponde ou non).
-
grep
trouve les lignes qui correspondent au motif. Pour cela, il doit charger une ligne à la fois en mémoire. GNUgrep
contrairement à beaucoup d'autresgrep
implémentations n'a pas de limite sur la taille des lignes qu'il lit et prend en charge la recherche dans les fichiers binaires. Donc, si vous avez un fichier avec une très grosse ligne (c'est-à-dire avec deux caractères de retour à la ligne très éloignés), plus grand que la mémoire disponible, il échouera.Cela se produirait généralement avec un fichier fragmenté. Vous pouvez le reproduire avec :
truncate -s200G some-file grep foo some-file
Celui-là est difficile à contourner. Vous pouvez le faire comme (toujours avec GNU
grep
):find ~/Documents -type f -exec sh -c 'for i do tr -s "