![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 15.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
mam plik logu pewnej gry, przykładowa linijka wygląda tak: [30 Nov 11:53:09] PARTY [Caelldfssion] jakiś tam tekst no i mam takie pliki utworzone przez siebie: dictionary.txt (słownik) o przykładowej zawartości: .*kur.* (na razie jeden wyraz) oraz channels.txt (schematy kanałów do przeglądania) i przykładowej zawartości: ^\[.. ... ..:..:..\] PARTY \[.*\] ^\[.. ... ..:..:..\] ALL [\[.*\] ^\[.. ... ..:..:..\] ALLIANCE \[.*\] ^\[.. ... ..:..:..\] TRADE \[.*\] ^\[.. ... ..:..:..\] HERO_VOICE \[.*\] i teraz sedno problemu... stworzyłem skrypt, który niestety nie działa i bardzo obciąża sprzęt bo wyszukuje w 30MB pliku (około 400000 linijek) i dla każdej jest odpowiednia ilość kombinacji wyszukiwania, dla w/w plików jest to 5^1 kombinacji (5), skrypt wygląda tak jak kod poniżej, jeżeli ktoś ma pomysł jak to dobrze rozwiązać aby działało i nie obciążało aż tak sprzętu to prosiłbym o pomoc skrypt:
wcześniej wczytałem cały 30MB plik do tablicy funkcją file() i nie było to dobre rozwiązanie, także obciążało, stąd chciałem przesiąść się na to, ale jak widać nieskutecznie. W kodzie mogą być drobne błędy jednak całość powinna być w miarę dobrze zrozumiana. Z góry dziękuję za pomoc. Ten post edytował Qwer 26.12.2009, 19:49:09 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
1. To, co ma być znalezione wrzucasz do tablicy:
- file, lub korzystając z while + feof + fgets 2. Następnie parsujesz plik: - pisane z palca, więc może nie działać. Zakładam, że jak w słowniku masz np. słowo CIUL a wiersz pliku zawiera "Pozdrawiam Was CIULE" to ma to znaleźć. Jeśli mają to być jakieś skomplikowane wyrażenia regularne etc. to trzeba pokombinować z takimi funkcjami: http://pl2.php.net/manual/pl/function.preg-grep.php |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 15.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
feof()+fgets() użyłem teraz, wcześniej użyłem też file() czyli wczytania do tablicy całego pliku i wtedy porównywania jednak, oba rozwiązania są kiepskie ponieważ plik ma jakieś 400000 linijek co należy pomnożyć przez ilość kombinacji dla każdej (ilość kanałów razy ilość wyrazów). Strasznie obciąża kompa i na koniec się wysypuje. Chyba że użyłeś czegoś co zapobiegnie takiemu obciążeniu, jeżeli tak i możesz to proszę opisz mniej więcej jak chciałeś to zrobić, z góry dzięki.
To co ma być znalezione także jest wrzucone do tablicy, robi to pierwsza pętla, łączy plik kanałów z plikiem słownika. przykładowe wyrażenie do znalezienia po połączeniu tylko jednego kanału z tylko jednym wyrazem: ^\[.. ... ..:..:..\] PARTY \[.*\] .*kur.* Ten post edytował Qwer 27.12.2009, 10:39:12 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli to ma być wyrażenie regularne to na pewno nie będzie szybkie, w swoim kodzie użyłem optymalnego przeszukiwania stringu do znalezienia w nim pierwszego wystąpienia szukanej frazy zamiast pregmatch, użyłem pętli foreach zamiast for, rtrim zamiast trim i zrezygnowałem z count, która nie wiem po co znalazła się w Twoim kodzie.
By działało szybciej proponuję porcjować to, co ma być wyszukiwane, zacząć od pliku z 1 szukanym wyrażeniem i sprawdzić jak działa i dopasować liczbę wyrażeń do możliwości serwera. Innej możliwości nie widzę. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 15.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za pomoc, mój skrypt już działa, błąd polegał na tym, że drugie wyrażenie regularne było źle sformułowane (drugi kanał) stąd się wysypywał, dalej jednak znacznie obciąża kompa, z czasem może i nad tym pomyślę rozpracowując to co podałeś i wykorzystując do swoich potrzeb, dzięki.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 18.09.2025 - 23:36 |