Stavo facendo una ricerca molto semplice:
grep -R Milledgeville ~/Documents
E dopo qualche tempo è apparso questo errore:
grep: memory exhausted
Come posso evitarlo?
Ho 10 GB di RAM sul mio sistema e poche applicazioni in esecuzione, quindi sono davvero sorpreso che un semplice grep esaurisca la memoria. ~/Documents
è di circa 100 GB e contiene tutti i tipi di file.
grep -RI
potrebbe non avere questo problema, ma voglio cercare anche nei file binari.
Risposta accettata:
Due potenziali problemi:
-
grep -R
(tranne per GNUgrep
modificato trovato su OS/X 10.8 e versioni successive) segue i collegamenti simbolici, quindi anche se ci sono solo 100 GB di file in~/Documents
, potrebbe esserci ancora un collegamento simbolico a/
per esempio e finirai per scansionare l'intero file system inclusi file come/dev/zero
. Usagrep -r
con il nuovo GNUgrep
oppure usa la sintassi standard:find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(tuttavia, tieni presente che lo stato di uscita non rifletterà il fatto che il modello sia abbinato o meno).
-
grep
trova le linee che corrispondono al modello. Per questo, deve caricare una riga alla volta in memoria. GNUgrep
al contrario di molti altrigrep
le implementazioni non hanno un limite alla dimensione delle righe che legge e supporta la ricerca nei file binari. Quindi, se hai un file con una riga molto grande (cioè con due caratteri di nuova riga molto distanti tra loro), più grande della memoria disponibile, fallirà.Ciò accadrebbe in genere con un file sparso. Puoi riprodurlo con:
truncate -s200G some-file grep foo some-file
Quello è difficile da aggirare. Potresti farlo come (sempre con GNU
grep
):find ~/Documents -type f -exec sh -c 'for i do tr -s "