GNU/Linux >> Znalost Linux >  >> Linux

Grep:Vyčerpaná paměť?

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 GNU grep 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žijte grep -r s novějším GNU grep 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. GNU grep na rozdíl od mnoha jiných grep 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 "
    
Linux
  1. Jak Grep v souborech Pdf?

  2. Grep Word v souboru a pak zkopírujte soubor?

  3. Potrubí k více souborům ve skořápce?

  1. Jak najít více řetězců v souborech?

  2. .o soubory vs. .a soubory

  3. wc gzip soubory?

  1. Jak prohledávat obsah více souborů pdf?

  2. Příkaz Linux:Jak „najít“ pouze textové soubory?

  3. Hledání spustitelných souborů pomocí ls a grep