2012-05-07, 10:06
  #1
Medlem
kvints avatar
Har en mapp med ca 600 MB textfiler.
I Linux söker jag igenom textfilerna efter en specifik textsträng ("foobar") med:

Kod:
grep -Fri --mmap --include='*.txt' 'foobar' *

Detta tar Linux 1 min och 26 sekunder att slutföra.
Upprepar jag sökningen direkt efteråt tar sökningen i princip lika lång tid vilket
tyder på att Linux inte cachar filerna.

I Windows kör jag:

Kod:
FINDSTR /s /i /c:"foobar" *.txt

Detta tar Windows 1 min och 9 sekunder att genomföra på första försöket.
Om jag upprepar sökningen (även med helt andra söksträngar) går sökningen på knappt 5 sekunder(!).

Antar att Windows "Prefetcher" cachar en hel del efter första försöket för att kunnna uppvisa sådana tider
på efterföljande försök, varför gör inte Linux det?

Alltså, hur kan jag få Linux att disk-cacha?


Både Windows och Linux körs på samma dator/hårdvara (dual-boot).
"Windows" är Windows Vista 32-bitar med Service Pack 2.
"Linux" är Fedora 16 med Linuxkärna: "3.3.4-1.fc16.x86_64".
Citera
2012-05-07, 11:40
  #2
Medlem
Vilken version av grep använder du? Vilket filsystem med vilka mount options? Hur mycket ledigt ram?
Om du kör följande kommando går det snabbare andra gången du kör det?
time cat * > /dev/null
Citera
2012-05-07, 12:59
  #3
Medlem
kvints avatar
Citat:
Ursprungligen postat av Akina
Vilken version av grep använder du?

GNU grep 2.9

Citat:
Ursprungligen postat av Akina
Vilket filsystem med vilka mount options?
Kod:
/dev/mapper/vg_fedora-lv_root on / type ext4 (rw,relatime,seclabel,user_xattr,barrier=1,data=ordered)

Citat:
Ursprungligen postat av Akina
Hur mycket ledigt ram?
Kod:
             total       used       free     shared    buffers     cached
Mem:          3702       1240       2461          0         20        889
-/+ buffers/cache:        331       3370
Swap:         5759          0       5759

Citat:
Ursprungligen postat av Akina
Om du kör följande kommando går det snabbare andra gången du kör det?
time cat * > /dev/null
Japp, första gången tog det 13 sekunder, efterföljande gånger går det på 0.3 sekunder. Det lär ju tyda på att disk-cachen är igång, men varför cachar den inte filerna jag greppar?
Citera
2012-05-07, 14:14
  #4
Medlem
Jag kan inte återskapa problemet. Använd ett diskövervakningsprogram t.ex. iotop för att försäkra dig om att grep verkligen läser datan från disk två gånger.
Citera
2012-05-07, 19:53
  #5
Medlem
kvints avatar
Har nu gjort lite test med
Kod:
/usr/bin/time -v grep -Fri --include='*.txt' 'foobar' *

och "free -m", allt tyder på att filerna cachas som de ska och att grep läser från cachen, då är det antagligen grep som helt enkelt är långsam...


EDIT: Hmmm, utelämnar jag i-flaggan till grep så går sökningen på 2 sekunder... tyvärr behöver jag den påslagen! :P Borde kanske kolla om sed är snabbare...
Citera
2012-05-07, 21:22
  #6
Medlem
Zoms avatar
Knepigt. Kan ju vara grep som inte är optimerat (låter märkligt), alternativt filsystemet som är långsamt (ext4 påstås ju ha väldigt bra prestanda).

Testa reiserfs, alt. jfs, och se om det gör någon skillnad?
Citera
2012-05-08, 01:36
  #7
Medlem
Har för mig "grep -i " är väldigt långsamt i UTF-8, så om det är UTF-8 kan du prova spara filen i ASCII och söka igen.
Citera
2012-05-08, 10:28
  #8
Medlem
Hur filen tolkas beror snarare på vilken locale som är satt. Du kan prova att sätta LC_ALL=C så att filen tolkas som en byte string. Men det är risk att du inte kommer få svaret du vill ha då.
Citera
2012-05-09, 08:36
  #9
Medlem
kvints avatar
Citat:
Ursprungligen postat av Akina
Hur filen tolkas beror snarare på vilken locale som är satt. Du kan prova att sätta LC_ALL=C så att filen tolkas som en byte string. Men det är risk att du inte kommer få svaret du vill ha då.

Tack, nu går sökningen på ~1 sekund.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in