Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Co jest lepsze, wydajniejsze?
M@k
post
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
Go to the top of the page
+Quote Post
lukaskolista
post
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


  1. <?php
  2. count(file('plik.txt'));
  3. ?>



Ten post edytował lukaskolista 23.03.2011, 09:20:36
Go to the top of the page
+Quote Post
M@k
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 28.04.2005

Ostrzeżenie: (0%)
-----


Cytat(lukaskolista @ 23.03.2011, 09:18:48 ) *
count(file('plik.txt'));



Czy ta metoda czasami nie zabiera najwięcej pamięci? ponieważ tworzy tablice
Odrzuciłem ją na samym początku i teraz nie wiem sam hmm
Go to the top of the page
+Quote Post
nospor
post
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++;
Go to the top of the page
+Quote Post
redeemer
post
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
Go to the top of the page
+Quote Post
nospor
post
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
Go to the top of the page
+Quote Post
redeemer
post
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
Go to the top of the page
+Quote Post
M@k
post
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ć.
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
M@k
post
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');
Go to the top of the page
+Quote Post
nospor
post
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
Go to the top of the page
+Quote Post
M@k
post
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
Go to the top of the page
+Quote Post
redeemer
post
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.
Go to the top of the page
+Quote Post
M@k
post
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?
Go to the top of the page
+Quote Post
redeemer
post
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
Go to the top of the page
+Quote Post
kiler129
post
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) ).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 17:02