Skocz do zawartości

[PHP] Co jest lepsze, wydajniejsze?


M@k

Rekomendowane odpowiedzi

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 :hello:

Odnośnik do komentarza
Udostępnij na innych stronach

W drugiej metodzie zaprzęgasz do działania funkcję powłoki które IMHO nie są wydajne do tego nie wszędzie włączone. Poza tym są inne metody odczytu z pliku jak:

file();

file_get_contents();

Poza tym licznik na plikach to bardziej skomplikowane zadanie niż się wydaje, bo przy większym ruchu musisz stosować odpowiednie blokady odczytu/zapisu inaczej licznik ci się wysypie.

Zdecydowanie lepszym sposobem będzie przechowywanie danych w szumnie nazwanej bazie SQLite która jest dostępna w PHP 5.

PS najlepszym sposobem określenia wydajności są testy wydajności danego rozwiązania.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Witam

Dzięki Mion za odpowiedz

To jest tak że chcę wylosować ileś lini z pliku, ale żeby to zrobić muszę znać ich liczbę. Wiadomo najszybciej to zrobić file itp i z głowy ale to pobiera bardzo dużo pamięci przy dużej liczbie plików. Dlatego wolę odczytać liczbę wierszy potem sobie wylosować i odczytać odpowiedni linie np. po przez while(!feof

Robiłem właśnie testy i wydaje się to najszybsze nie mówiąc już o oszczędzeniu pamięci. Dlatego szukam najszybszej i najlepszej metody odczytu liczby Lini.

Odnośnik do komentarza
Udostępnij na innych stronach

Z tego co rozumiem chodzi jedynie o sprawdzenie liczby lini w pliku.

Szybki test dla 10k lini

Shell: 0.061s

Fread: 0.053s

Count(file()): 0.107s (zapewne dlatego, że wczytuje cały cplik do pamięci)

Ale np. samo wc -l zajmuje 0.004s

Na emeryturze po SEO zajmuję się R&D.

Odnośnik do komentarza
Udostępnij na innych stronach

@Veal tak dokładnie chodzi tylko o liczbę linii w pliku

Też zrobiłem test i 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?

Z tego chyba wynika że metoda druga jest najlepsza

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz wczytać tylko losowe linie to chyba lepiej wywołać odpowiednią komende to robiącą z poziomu shell_exec() a nie liczyć linie i później wczytywać losową.

Czyli proponuję jakieś shell_exec('shuf -n 1 file') i masz odrazu zwróconą treść losowej lini.

Ponadto 90% czasu zajmuje uruchomienie skryptu php a nie zagnieżdzonego w nim skryptu powłoki dlatego proponuje zrobić jakiś rozbudowany, pojedynczy shell_exec() dla wszystkich plików naraz (jeśli to możliwe).

Na emeryturze po SEO zajmuję się R&D.

Odnośnik do komentarza
Udostępnij na innych stronach

@Veal

Ale skąd mam wiedzieć ile tych linii jest i skąd mam wiedzieć z jakiego zakresu losować?

A już wiem shuf :)

A czy mógł byś napisać tylko jak odczytać np 5 lniii tym sposobem?

@Veal to jest genialne :rolleyes:

Kod mi się zmniejszy o 95%

Serdeczne dzięki :)

Odnośnik do komentarza
Udostępnij na innych stronach

@liczeniu linii z pliku?

A ja na szybko odczytałem "licznik na pliku" :rolleyes: stąd info o blokadzie pliku beee

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

@Veal a mam jeszcze prośbę.

Czy mógł byś napisać jak by wyglądało to rozbudowanie aby za jednym razem przy okazji odczytać 1 linie.

Aby działo to tak że chce odczytać np 5 linii losowych czyli tak shell_exec('shuf -n 5 file') a co tu należało by dodać aby przy okazji wczytać zawsze na początku 1 linie i 5 losowych później? Czy razem by było 6.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności