![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam taki pytanko, co lepiej wybrać przy dość częstym liczeniu linii z pliku? Nasuwają mi się te dwie metody: 1. if($fh = fopen('file', 'r')) { while($chunk = fread($fh, 8192)) { $liczba_lini += substr_count($chunk, "\n"); }} 2. $chunk = @shell_exec('wc -l file'); preg_match("/(.*?) \/home(.?)/",$chunk ,$czesc); $liczba_lini = $czesc[1]; I teraz nie wiem która jest wydajniejsza, mniej obciążająca serwer pamięć itp Wydaje mi się ze metoda druga, ale nie wiem jak to z częstym wychodzeniem z php czy to nie spowalnia i nie katuje serwera. A może ktoś zna jeszcze inna metodę? Z niecierpliwością czekam na odpowiedz i pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
To nie możesz sprawdzić? Zarzuć każdy kod w pętli, zmierz czasy, sprawdź jak skacze pamięć i będziesz wszystko wiedział.
ps: $liczba_lini += substr_count($chunk, "\n"); przecież fread czyta plik po linijce, więc wystarczy: $liczba_lini++; |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Rozwiązanie wc -l wydaje mi się być najbardziej optymalne. Jedynym minusem jest, że na takim Windowsie nie zadziała.
@nospor: Chyba chodziło Ci o fgets? Ten post edytował redeemer 23.03.2011, 09:26:40 |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Chyba chodziło Ci o fgets? http://pl.php.net/manual/en/function.fread.php Cytat fread() reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met:
length bytes have been read EOF (end of file) is reached |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
EOF - End of file
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Własnie robiłem testy i czasy są porównywalne, i nie wiem co wybrać.
Jeśli chodzi o drugą metodę to nie ma problemu bo to jest na Linux ale nie wiem jak to własnie jest z częstym wychodzeniem z php, czy to nie morduje serwera. @nospor: twoje rozwiązanie jak słusznie zauważył @redeemer nie będzie działać. |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat EOF - End of file LOL..... sorki, skupiłem się tylko na End of (IMG:style_emoticons/default/smile.gif) No to zamień fread na fgets i po sprawie (IMG:style_emoticons/default/smile.gif) Cytat Własnie robiłem testy i czasy są porównywalne, i nie wiem co wybrać. Mógłbyś pokazać te testy? Znaczy jak je robiłeś, kod.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
A cie proszę @nosper (IMG:style_emoticons/default/biggrin.gif)
$start = microtime(true); Kod itp print('czas wykonania: '.round((microtime(true) - $start), 5).' s'); |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Miałeś dać to w pętli np. 1000 razy i dla tej petli zmierzyć czas
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Może zapytam inaczej czy użycie z trybu php funkcji powłoki jest wydajne.
Czy lepiej użyć wew. funkcji php? Czyli co jest bardziej wydajne 1 czy 2 metoda. @nosper zaraz sprawdzę (IMG:style_emoticons/default/wink.gif) Ten post edytował M@k 23.03.2011, 09:48:31 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wykonaj testy na dużych plikach, bo na małych faktycznie może nie być widać różnicy.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 28.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Hmm w sumie nie spodziewałem się tego hmm
1. czas wykonania: 1.58546 s 2. czas wykonania: 7.57901 s Różnica jest kolosalna Pętla 1000 razy na pliku ok 3 tys lini Co o tym sądzicie? Czy czasami 1 metoda nie jest w pamięci przetrzymywana? |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Mi wyszło zupełnie co innego. Pętla 100 razy, plik: dump sql, 3351 linii, ~59MB. Skrypt uruchamiany z konsoli.
fread: 4.02844 wc -l: 1.77387 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wykonanie kodu powłoki będzie wydajniejsze dla 1 dużego pliku ale wolniejsze dla wielu małych plików. Używanie exec() w pętlach to mordęga dla kodu (szczególnie na systemach wbudowanych - kto widział jak działa panel www NAS`ów firmy WD wie o czym mowa (IMG:style_emoticons/default/biggrin.gif) ).
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 17:02 |