Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Zbyt duży plik dla grep?  (Przeczytany 4929 razy)

cadi2108

  • Gość
Zbyt duży plik dla grep?
« dnia: 2010-02-17, 15:08:44 »
Witam ponownie!

Tym razem mam problem dotyczący wyszukiwania słów w bardzo dużych plikach. Mam plik wielkości 4GB, chcę wyszukać w nim wszystkie wystąpienia danego słowa. Naturalnym rozwiązaniem się wydaje użycie polecenia grep:

grep -l "szukane_slowo" nazwa_pliku.txt
Niestety, dla pliku o wielkości 4GB wyświetla się komunikat:

grep: nazwa_pliku.txt: Nie można przydzielić pamięci
Ma ktoś może jakiś pomysł jak można obejść ten problem? Za wszelkie propozycje będę bardzo wdzięczna.

arctgx

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #1 dnia: 2010-02-17, 15:52:25 »
Może zacznij od sprawdzenia czy powłoka ma narzucone jakieś limity:
ulimit -a

cadi2108

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #2 dnia: 2010-02-17, 16:10:52 »
Oto wynik:
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 8181
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 8181
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Na co mam patrzeć? Na max locked memory? virtual memory?

EDIT: dodam, że mam 1GB RAM i SWAP 512 MB

arctgx

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #3 dnia: 2010-02-17, 16:48:04 »
Też na razie nie potrafię niczego wartościowego wyciągnąć z wyniku.

Wątpię, że plik musi być załadowany cały do pamięci, by mógł zostać przetworzony przez grepa. Wtedy ograniczeniem byłaby albo 1.5 GB wspólnej pamięci, albo 4 GB wynikające z architektury 32-bitowej (gdyby np. dodać wystarczająco dużo pamięci wymiany). Tu sam posłuchałbym kogoś, kto lepiej zna rzecz.

cadi2108

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #4 dnia: 2010-02-17, 17:08:16 »
Tu chyba jest odpowiedź: http://www.daniweb.com/forums/thread64706.html

Jak tak to nieciekawie;/ Nie ma innej metody aby przeszukać ten plik? :(

arctgx

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #5 dnia: 2010-02-17, 18:03:46 »
Spróbuj napisać prostą pętlę w powłoce, która będzie za pomocą dd kopiowała na standardowe wyjście kolejne wystarczająco małe kawałki pliku (patrz: skip, bs, count) i wpuszczała je do grepa. Pętlę możesz opakować w funkcję, której możesz używać jako grepopodobnego polecenia. Nie bawiłem się na razie, inaczej wkleiłbym kod.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Zbyt duży plik dla grep?
« Odpowiedź #6 dnia: 2010-02-17, 18:21:39 »
1. Sprecyzuj, co chesz wyszukać. Podany przez Ciebie parametr -l (małe L) służy do przeszukania kilku plików i określenia, które zawierają szukane słowo, kończąc na nim przeszukiwanie pliku (tj znajduje pierwsze wystąpienie słowa w każdym pliku). A piszesz że chcesz znaleźć wszystkie wystąpienia.

2. Jak chcesz wszystkie wystąpienia w jednym pliku, to spróbuj:
grep "słowo" < duży_plik
Jak przeszukujesz rzeczywiście więcej plików to konstrukcja będzie taka (grep zwraca kod błędu przy braku dopasowania)

for PLIK in *
do
 if grep -l -q 'slowo' <"${PLIK}"
 then
  echo "Znaleziono w pliku '${PLIK}'"
 fi
done
Przy if nie ma nawiasów, tak ma być.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

cadi2108

  • Gość
Zbyt duży plik dla grep?
« Odpowiedź #7 dnia: 2010-02-17, 18:48:31 »
Mam do przeszukania jeden duży plik 4 GB.
grep "słowo" < duży_plik
Wywołuje ten sam błąd co jest wyżej, że nie można przydzielić pamięci. Rozwiązanie tego problemu jest inne, zamieszczam je gdyby komuś to kiedyś mogło być potrzebne:
strings nazwa_pliku | grep "slowo"