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 ça?
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 des fichiers binaires.
la source
grep
pouvez supprimer les tampons traités jusqu’à présent. Vous pouvezgrep
sortiryes
indéfiniment sans utiliser plus de quelques kilo-octets de mémoire. Le problème est la taille des lignes.--null-data
option GNU grep peut également être utile ici. Il force l'utilisation de NUL au lieu de newline comme terminateur de ligne d'entrée.Je fais habituellement
J'ai essayé un tas de méthodes et j'ai trouvé que c'était le plus rapide. Notez que cela ne gère pas très bien les fichiers avec des espaces, le nom de fichier. Si vous savez que c'est le cas et que vous avez une version GNU de grep, vous pouvez utiliser:
Sinon, vous pouvez utiliser:
Quel sera
exec
un grep pour chaque fichier.la source
find -print0 | xargs -0 grep -ne 'expression'
find -print0
etxargs -0
à ce jour: les trois BSD, MINIX 3, Solaris 11,…Je peux penser à quelques façons de contourner cela:
Au lieu de mettre tous les fichiers à la fois, créez un fichier à la fois. Exemple:
Si vous avez seulement besoin de savoir quels fichiers contiennent les mots, faites-le
grep -l
plutôt. Puisque grep arrêtera de chercher après le premier coup, il ne sera pas obligé de lire de gros fichiers.Si vous souhaitez également obtenir le texte réel, vous pouvez également y insérer deux groupes distincts:
la source
grep
sorties utilisent un délimiteur qui est légal dans les noms de fichiers). Vous devez également citer$file
.for
traitement du fichier sera alors traité comme deux arguments)Je cherche un disque de 6 To pour rechercher les données perdues et la mémoire est épuisée - erreur. Cela devrait fonctionner pour d'autres fichiers aussi.
La solution que nous avons proposée consistait à lire le disque en morceaux en utilisant dd et en les attrapant. C'est le code (big-grep.sh):
la source