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 GNUgrep
nalezený na OS/X 10.8 a vyšším) následuje symbolické odkazy, takže i když je v~/Documents
souborů 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 -r
s novějším GNUgrep
nebo 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).
-
grep
najde čáry, které odpovídají vzoru. K tomu musí do paměti načítat jeden řádek po druhém. GNUgrep
na rozdíl od mnoha jinýchgrep
implementace 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-file
Ten 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