![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie!
Skrypt który pisze ma dość specyficzne środowisko uruchomieniowe - nieco ponad 150Mhz procesora ARM i 80MB ramu. Początkowo wykonywałem komendę "tail -n 4 plik" jednakże w pętli jest to mało efektywne. Do tego stopnia, że dla 10 elementów zajmuje to ok 2 sekund (jest to nie do zaakceptowania w moim przypadku). Przez ostatnią godzinę krążę w kółko - fopen, fgets itp. Niestety nie wiem jak pobrać ostanie X linii z pliku. Pobranie z początku nie sprawia mi problemu:
Mogę co prawda użyć funkcji file() i pobawić się tablicą jednakże ładowanie do pamięci całego pliku (od 100KB do 1MB) nie ma nic wspólnego z wydajnością (IMG:style_emoticons/default/dry.gif) Czy któryś z kolegów może podać mi sposób na implementację funkcji tail w php? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tutaj masz odczytanie ile jest linii:
Wtedy będziesz mógł puścic pętle od $lines-10 do $lines. Niestety nie wchodzi to w grę - file() ładuje cały plik do pamięci jako tablicę co z góry odpada przy zasobach jakie posiadam. Udało mi się odgrzebać w swoich zbiorach taką funkcję a następnie lekko zmodyfikować:
Jednakże i ona ma swoje wady - te dwie pętle w sobie nie są zbyt wydajne. Ktoś na sali ma pomysł na optymalizację? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Musisz użyć fseek by poruszać się po pliku, już raz odpowiadałem na takie pytanie:
http://forum.php.pl/index.php?showtopic=13...st&p=698149 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Musisz użyć fseek by poruszać się po pliku, już raz odpowiadałem na takie pytanie: http://forum.php.pl/index.php?showtopic=13...st&p=698149 Podane przez ciebie rozwiązanie ma sens (i je znam) ale ma jednego buga - co jeśli linia ma zmienna długość od 10 do 400B? ;] Przekopałem już sporo kodu w internecie i chyba tylko to co udało mi się znaleźć w swoich zbiorach działa w każdych warunkach (szukając \n). edit: W manie dokopałem się też do innego sposobu realizacji. Ma ograniczenie do 4KB/linię (chyba że się mylę w interpretacji kodu to proszę mnie poprawić). Jest nieco szybsza (~18%) od mojej. Delikatnie zmodyfikowałem aby nie pluło tyle notice oraz domyślną ilość linii dla zgodności z *nixowym tailem (10 zamiast 100) (IMG:style_emoticons/default/winksmiley.jpg)
edit2: Pospieszylem się ... moja funckcja zawiera błąd powodujący odwrócenie kolejności linii. edit3: Jak widać zagadnienie taila w php nie jest takie banalne jak mogło by się wydawać. Po testach pokazana wyżej funkcja robi błędy! Nie starałem się jej debugować jednakże czasami zwraca 3 linie zamiast 4, czasami pusty string (wtf?!). Poprawiłem nieco moją funkcję dodając zmieniając return $ret na implode("\n", array_reverse(explode("\n", $ret))) [tak na szybko] i działa względnie poprawnie ... chociaż też nie do końca. Czy ktokolwiek jest w stanie pokazać dlaczego ni jedna ni druga funkcja nie działają w 100% poprawnie? Ew. czy ktoś zna C i może powiedzieć jak robi to oryginalny tail? edit4: Udało mi się znaleźć funkcję która działa i jest 3x szybsza od mojej. Naśladuje praktycznie w 100% taila.
Ten post edytował kiler129 22.09.2010, 18:48:52 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Cytat Podane przez ciebie rozwiązanie ma sens (i je znam) ale ma jednego buga - co jeśli linia ma zmienna długość od 10 do 400B? ;] - to oczywiste, że linia ma zmienną długość dlatego należy założyć 10*maksymalna długość linii i od tego miejsca parsować plik przechowując w tablicy tylko 10 linijek. Identycznie mogłeś zrobić lekko modyfikując swój kod z początku tematu, ale po co przekopywać się przez cały plik? Jeśli ma parę mega to trochę by to trwało (IMG:style_emoticons/default/smile.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 07:56 |