Szeretnék keresni sok nagy gz file-ban egy php-ban. Eddig az exec tünt a legegyszerűbb megoldásnak egy zcat segítségével, de ez kicsit lassúnak tűnik, az is :)
Hogy tudnám ezt más alapokra helyezni, esetleg több egyidejű szálon keresni a file-okban?
Vagy van erre valami bevált megoldás?
- 1543 megtekintés
Hozzászólások
Rengeteg bevált megoldás van.
A spektrum a több vagy gyorsabb hardver alkalmazásától az előfeldolgozáson át (lusta végrehajtás, gyorstárazás, indexelés), a tömörített szövegben keresni képes algoritmusok (lzgrep) alkalmazásáig terjed.
Részletgazdag probléma leírás nélkül nem lehet ezek közül választani.
- A hozzászóláshoz be kell jelentkezni
igazából ezek log file-ok, melyekben minden mezőt szaparátor választ el. elég nagy file-ok, így az egész membe olvasása teljesen felesleges.
Egyez mezők értékeire lenne feltétel megadva, ami alapján kéne szűrni. A végeredményt szöveges vagy tömbös formában képzeltem el, amit egyszerűen lehetne egy táblázatban megjeleníteni.
minden nap keletkezik egy ilyen gz file és a megadott napokra, időszakra (ez végül is már a témától független) kéne több file-ban keresni.
utánna nézek, amit írtál
- A hozzászóláshoz be kell jelentkezni
> igazából ezek log file-ok,
Ez kizárja a "lusta végrehajtás"-t. Ha jórészt egy felhasználó érdekében kell csak keresni, akkor nincs értelme összevárni kereséseket.
> Egyes mezők értékeire lenne feltétel megadva, ami alapján kéne szűrni.
Nem mindegy hogy mennyit lehet előre tudni ezekről a feltételekről. Előre nem ismert lekérdezések végrehajtására az SQL egy kényelmes eszköz, a log-ok ezek szerint mehetnének valami adatbázisba (indexelés). Előre ismert lekérdezések eredményeit pedig a gz fájlok keletkezésekor le lehetne generálni (gyorstárazás).
- A hozzászóláshoz be kell jelentkezni
a log file-ban van, minek töltsem sql-be, előre nem ismert a feltétel, mert azt a felhasználó adja meg
- A hozzászóláshoz be kell jelentkezni
> előre nem ismert a feltétel, mert azt a felhasználó adja meg
Akkor ki kellene kérdezni a felhasználót, hogy mire használja fel az adatokat. Például minden reggel megnézi, hogy X, majd ha azt látja hogy Y, akkor megnézi még azt is hogy Z. Szóval előfordulhat, hogy a felhasználónak vannak gyakran használt "forgató könyvei". Rendszeresen összeállít valami jelentést, kvótát ellenőriz, stb.
> a log file-ban van, minek töltsem sql-be,
Azt írtad: "kicsit lassú"; ha nem változtatsz semmin, akkor ugyanilyen lassú marad.
- A hozzászóláshoz be kell jelentkezni
mivel a file adott, és nem igazán szeretném többször tárolni, mert pár 10 G méretű, így nem tudom, hogy tudnék előre definiált feltételeket gyártani.
igazából 2 részre keresnek rá, de azon belül bármire, teljes kifejezéssel, vagy rész kifejezéssel.
egy megoldást látok a sebesség növelésére, ez pedig a párhuzamos file feldolgozás lenne. de ez nem tudom mennyire kivitelezhető php-ban. még arra is gondoltam, hogy egy tmp file-ba írom bele az eredményt, vagy többe, és akkor ezeket felolvasom.
- A hozzászóláshoz be kell jelentkezni
> igazából 2 részre keresnek rá
A "pár 10G" méretnek hány %-át érinti ez a "2 rész"? Nyilván ha 98%, akkor az más eset, mint ha 2%.
> ez pedig a párhuzamos file feldolgozás lenne.
Ha a lassúság a diszk IO lassúságához kötődik, akkor a párhuzamos feldolgozás (több hardver igénybevétele) nem segít.
- A hozzászóláshoz be kell jelentkezni
Tudsz gyerek processeket gyartani.
http://hu2.php.net/pcntl_fork
( http://code.google.com/p/php-pthreads/ )
Vagy hasznalhatsz C kodot, amit php -bol hivsz ami esetleg szalakat is hasznalhat, ha az szimpatikusabb.
Ha regexp-et hasznlasz vigyaz arra, hogy a megoldasod ne forditsa mindig ujra regexpet, ha a feladat egyszerubben megoldhato regexp nelkul is, akkor C.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
néztem és jónak tűnik
köszi
- A hozzászóláshoz be kell jelentkezni
Én is inkább sql-be tolnám be az egészet és abban keresni. Szerintem egyszerűbb és persze gyorsabb, mint php-val fájlokat végignyálazni. De még egyszerább ha már a log egyből megy adatbázisba (is). (linuxot feltételezve syslog-ng vagy rsyslogd)
- A hozzászóláshoz be kell jelentkezni
megoldható lenne, csak nincs annyi szabad hely a gépen, hiába sír a szám :), hogy duplikáljam.
nekem is az lenne a legegyszerűbb, ha ott kereshetnék, jól beállított index-ekkel.
de ezek csak sajna file-ok
- A hozzászóláshoz be kell jelentkezni
Talán mert pont erre találták ki...? A lényegesebb mezőkre lehet indexeket aggatni, lehet megfelelő keresésekre view-t definiálni, ésatöbbi...
- A hozzászóláshoz be kell jelentkezni
php-nek van zlib és bzip2 libje is, így nem kell system-et hívnod. Aztán lehet használni a megfelelő read (bzread) függvényt.
Persze a sorokban neked kell már keresned regexp-el vagy valamivel.
- A hozzászóláshoz be kell jelentkezni
ezt már néztem, de mivel sok file van, ennek egymás utáni nyitogatása és végig szűrése, elég sok időt vesz igénybe. Azt valahogy nem lehetne, hogy párhuzamosan dolgozzal fel a file-okat, így sokkal rövidebb idő alatt végezne velük?
- A hozzászóláshoz be kell jelentkezni
> hogy párhuzamosan dolgozzal fel a file-okat
google talált egy ilyet: http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-…
- A hozzászóláshoz be kell jelentkezni
:-)
- A hozzászóláshoz be kell jelentkezni
na jó nem a tieid között, bár ki tudja :)
- A hozzászóláshoz be kell jelentkezni
:-)))
- A hozzászóláshoz be kell jelentkezni
találtam egy egyszerű megoldást, ami talán lehedi az én szükségeimet.
ez a legkevesebb fejlesztést igényli tőlem most.
ami nem állna másból mint az elején említett exec-et.
lenne egy pl. exec("zgrep mit hol1 & zgrep mit hol2 & zgrep mit hol3 .....", $out);
így az op elvégzi helyettem az összes feladatot, és azt kapom amit szerettem volna.
az eredményt már kezelhetem bárhol.
- A hozzászóláshoz be kell jelentkezni
Ez egy randa hekkelt workaround...
- A hozzászóláshoz be kell jelentkezni
jobb ötlet?
- A hozzászóláshoz be kell jelentkezni
A probléma helyes megfogalmazásával kezdeném... A tömörített szövegfájl helykihasználásra van optimalizálva, neked viszont keresésre kell optimális(hoz közeli) állapotot létrehozni. Minden egyes lekérdezésnél kicsomagolni, szekvenciálisan végigmenni... Sem nem optimális, sem nem szép, radásul erőforrás-zabáló is. (Csak egy közbevetett kérdés: időintervallumot pl. regexp-pel hogy írsz le, hogy gyorsan és pontosan működjön?)
Ami korábban is volt, hogy valamilyen sql-lel kérdezgethető adatbázisba raknám értelmesen a logot (ami pl. időpont benne, azt dátumként, ami szám, azt numerikus mezőbe, sőt a log tartalmi részét is megpróbálnám valamilyen módon normalizálni a betöltés során), és onnan egyszerű select... from ... where ... módszerrel szedném ki a releváns adatokat.
Esetleg meg lehet próbálni valamilyen indexelő eszközzel a sima szöveges fájlt megetetni, és ebben az adathalmazban keresni. (Webes tartalomra pl. ott van a phpdig...).
- A hozzászóláshoz be kell jelentkezni
Meg kicsit veszélyes is. Ha a pár 10G-s fájlt a júzer olyan feltétellel szűri, hogy végül is nem/alig szűri, akkor ennek a gépnek reszeltek - ha nincs nagy swap azért, ha van, azért.
- A hozzászóláshoz be kell jelentkezni