Prováděl jsem velmi jednoduché vyhledávání:
grep -R Milledgeville ~/Documents
A po nějaké době se objevila tato chyba:
grep: memory exhausted
Jak se tomu mohu vyhnout?
Mám v systému 10 GB RAM a běží málo aplikací, takže jsem opravdu překvapen, že jednoduchému grepu dojde paměť. ~/Documents je asi 100 GB a obsahuje všechny druhy souborů.
grep -RI nemusí mít tento problém, ale chci hledat i v binárních souborech.
Přijatá odpověď:
Dva potenciální problémy:
-
grep -R(kromě upraveného GNUgrepnalezený na OS/X 10.8 a vyšším) následuje symbolické odkazy, takže i když je v~/Documentssouborů pouze 100 GB , stále může existovat symbolický odkaz na/například a skončíte skenováním celého systému souborů včetně souborů jako/dev/zero. Použijtegrep -rs novějším GNUgrepnebo použijte standardní syntaxi:find ~/Documents -type f -exec grep Milledgeville /dev/null {} +(Uvědomte si však, že stav ukončení nebude odrážet skutečnost, zda vzor odpovídá nebo ne).
-
grepnajde čáry, které odpovídají vzoru. K tomu musí do paměti načítat jeden řádek po druhém. GNUgrepna rozdíl od mnoha jinýchgrepimplementace nemá omezení na velikost řádků, které čte, a podporuje vyhledávání v binárních souborech. Pokud tedy máte soubor s velmi velkým řádkem (tj. se dvěma znaky nového řádku velmi daleko od sebe), větším než je dostupná paměť, selže.To by se obvykle stalo s řídkým souborem. Můžete jej reprodukovat pomocí:
truncate -s200G some-file grep foo some-fileTen se dá těžko obejít. Můžete to udělat jako (stále s GNU
grep):najít ~/Documents -type f -exec sh -c 'for i do tr -s "Bash skript k odstranění nejstaršího souboru ze složky? Jak vytvořit pole jedinečných prvků ze řetězce/pole v Bash?Linux