Muszę przeczytać duży plik i zanim zacznę go czytać, muszę znać całkowitą liczbę wierszy w pliku (w milionach).
Wdrożyłem wiele rozwiązań i znalazłem jedno. Ale podczas moich poszukiwań zastanawiałem się, jak to wc -l
działa. Nie mogłem nic znaleźć w Google.
Chociaż znalazłem rozwiązanie mojego problemu, nadal chciałbym wiedzieć, jak to wc -l
działa, ponieważ może obliczyć liczbę linii pliku z 92 milionami linii w ciągu kilku sekund!
W jaki sposób?
Odpowiedzi:
Czyta cały plik i liczy liczbę zakończeń linii. Liczenie zakończeń linii jest naprawdę tanie; większość czasu spędza na czytaniu pliku. Jeśli plik znajdzie się (głównie) w pamięci podręcznej bufora, to też będzie tanie. W przeciwnym razie będzie to zależeć od szybkości przechowywania plików.
Innymi słowy, nie ma magii.
źródło
WC po prostu odczytuje plik w blokach surowych bajtów (najlepiej w wielokrotnościach naturalnego rozmiaru bloku bazowego systemu plików, na którym znajduje się plik).
Następnie skanuje tylko bufor, licząc znaki końca linii. (Zlicza również spacje, tabulatory, formularze i inne znaki specjalne, na wypadek, gdybyś potrzebował innych informacji niż wyjście -l.)
Odczytywanie z dysku jest kosztowną częścią pod względem prędkości. Skanowanie bufora zajmuje w porównaniu z tym czas do pominięcia.
Załóżmy, że masz 90 milionów linii ze średnio 100 znakami w linii.
To około 9 000 000 000 znaków lub około 860 MB.
Dobry komputer z napędem SATA-3Gb / s zrobi to w mniej niż 10 sekund. Nawet na stosunkowo wolnym systemie plików z pewną inną aktywnością.
Szybka maszyna z dostrajaniem wydajności i zoptymalizowanym systemem plików może to zrobić w ciągu 5 sekund, nawet bez konieczności uciekania się do SATA-6G i napędu SSD.
źródło
\n
) znaków - „l, --lines drukowania liczby nowej linii \ n \” - pochodzących zwc.c
wc -l
... przepraszam ...Witamy w świecie wolnego oprogramowania. Zawsze możesz spojrzeć na kod źródłowy
Chociaż muszę przyznać, że nie jestem programistą C, więc nie jestem tym, który tak naprawdę może wyjaśnić ci kod (i sam byłbym zainteresowany ).
Wiem, że ponieważ wc nie otwiera samego pliku, ale prosi system operacyjny, aby to zrobić, zależy to w dużej mierze od systemu operacyjnego i oczywiście od sposobu przechowywania pliku. Poza tym spodziewam się, że muszą istnieć prawidłowe praktyki programowania, np. Nie próbować odczytywać pliku jako całości na raz itp.
źródło