Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie dużego pliku .txt
Forum PHP.pl > Forum > PHP
danket
Witam!
Pytanie moje dotyczy problemu, a w zasadzie możliwości przeparsowania dużego, wręcz ogromnego pliku .txt
Buduję serwis związany z nieruchomościami. Wszystkie oferty oraz wszystkie transakcje na rynku nieruchomosci od mniej więcej 1995 roku znajdują się w bazie danych, baza natomiast zarządzana jest przez system MLS (Multiple Listing Service). Jak nietrudno się domyślić, baza jest ogromna (w chwili obecnej około 100,000 pozycji). Każdej nocy system MLS-u zrzuca zawartość bazy do pliku txt w postaci 1rekord->1linia, a więc każdej nocy powstaje plik ze stu tysiącami linii, co daje mniej więcej około 90MB. Jako firma zrzeszona w systemie MLS mamy dostęp do owego pliku przez FTP i tylko przez FTP, nie ma w ogóle dostępu do dB.
Plik tekstowy wygląda mniej wiecej tak:

idNieruchomosci|idSystemowe|typNieruchomosci|idFirmy|idAgenta|cenaNieruchomosci|
..|...|...|.. itd
i tak 100,00 razy :)

Pytanie moje brzmi: czy ktokolwiek z szanownych forumowiczów miałby jakiekolwiek sugestie, jak w tak ogromym pliku, do którego jest tylko i wyłącznie dotęp przez FTP, wynaleźć te linie, które spełniają określone kryteria? Np. jak znaleźć takie linie, w których na pozycji 'idFirmy' występuje '123456' ? Bez większego wysiłku umysłowego fgets() i fscanf() odrzucam. Nie przy tak ogromych plikach. Jak to ugryźć? Przypominam, że plik znajduje sie na serwerze zdalnym, kosmicznie szybkim, ale jednak zdalnym, a
CODE
fopen('ftp://user:pass@server.com','r');

nie sprawia żadnego problemu.

Czy ktoś w ogóle z was spotkał się z takim zagadnieniem? Znalazłem pewne sugestie dotyczące parsowania dużych xml-i, ale tu dochodzi ewentualne wyszukiwanie w stringu. Zwracam się o pomoc, bo przetestowałem większośc możliwości.

Dzięki.
Nekro
Witam

Stworz swoja baze o odpowiedniej strukturze i jesli oni raz dziennie robia zrzut bazy do pliku txt to ja bym Ci radził w takim, razie raz dziennnie przetwarzac ten plik TXT i wrzucac z niego dane do swojej bazy, a wtedy wyszukanie pozycji to juz nie problem.
Jesli robia zrzut wszystkich danych to dodajesz tylko te liniki które sie beda roznic, albo od razu zastepujesz wszystkie istniejace nowymi.
Przeszukiwanie takie pliki, z tego co mi sie wydaje, wymagało by odczytywania linijka po linijce i sprawdzanie czy dany wiersz pasuje do zapytania - rozwiązanie nie do przyjęcia (chyba wiadomo dlaczego).
danket
Witam.
Dzięki za podpowiedź. Tak tez myślałem czy by nie duplikować bazy u siebie na serwerze, ale.. Nie bardzo wiem jak będzie pracował serwer mysql ze 100,000 (tak - sto tysięcy) rekordów. Po prostu nie wiem, bo nigdy nie pracowałem z tak dużą bazą. Ile trwałoby utworzenie takiej bazy na podstawie pliku? Mam dość szybki serwer, DualCore 2.6GHz / 8GB RAM-u i SATA-y 3gigowe, ale i tak sobie myślę, że to by zajęło dość sporo czasu. Poza tym, tak sobie myślę, musiałoby to działać tak, że ów plik ze zrzutem bazy, serwer zasysałby co noc na lokalny dysk. To to jest mały problem, bo ich łącze pozwala na download rzędu 4MB/sek, więc przy w miarę niezapchanej sieci całość pliku, jakieś do 100MB kopiowała by się z marginesem do minuty czasu. Zresztą tyle idzie idzie po FTP.

Sam już nie wiem. Pytania więc do forumowiczów którzy spootkali się z tym tematem już:
1. Jak długo trwałoby utworzenie takiej bazy danych? Sto tysięcy rekordów, 40 pól na rekord?
2. Jak długo trwałoby wyszukanie jednego rekordu spełniającego kryteria?
3. Czy jest może jakieś inne rozwiązanie? Nie wiem, jakieś repozytorium, PEAR/PECL, cokolwiek?

Dzięki,
Dan
phpion
Cytat(danket @ 18.12.2007, 10:54:05 ) *
Nie bardzo wiem jak będzie pracował serwer mysql ze 100,000 (tak - sto tysięcy) rekordów.

Na pewno zdecydowanie szybciej niz na czystym pliku txt.
Ściąganie pliku zajmuje ok. minutę - i to jest problem? Może jest możliwość zrzutu danych z bazy bezpośrednio do zapytań SQLowych (mysqldump), a nie do pole1|pole2... Wtedy mógłbyś po prostu wykonywać taki plik ładując dane od razu do bazy.
tomeksobczak
Cytat(danket @ 18.12.2007, 08:54:05 ) *
Nie bardzo wiem jak będzie pracował serwer mysql ze 100,000 (tak - sto tysięcy) rekordów.

Taka ilość to żadna ilość (oczywiście przy odpowiednich indeksach)
Cytat(danket @ 18.12.2007, 08:54:05 ) *
Mam dość szybki serwer, DualCore 2.6GHz / 8GB RAM-u i SATA-y 3gigowe

przy podobnej konfiguracji mam bazy rzedu 15,000,000 rekordow i bardzo wymagajacym systemie i chodzi bez problemu

a mysql na 2 x QuadCore 2GHz / 32GB RAM / 1TB RAID10 SCSI ciągnie bez najmniejszego zgrzytu baze okolo 70,000,000 rekordow w tabeli (baza ma 238GB i średnią około 3000 queries per second) także doceń szybkość mysql i nie przerażaj sie liczbą 100,000 rekordów smile.gif
netmare
Co prawda nie znam się tak na bazach jak koledzy, jednak w prawie identycznym zastosowaniu pliki csv około 100 mb użyłem postgresa. I zapytaniem COPY kopiuję zawartość całego pliku w około 15 sekund na dużo wolniejszym komputerze. Oczywiście wszystko się udało ładnie zautomatyzować w php.
Nekro
Najelpiej bylo by jakbys zamiast tego TXT (tak jak wspomnial phpion.com) zrobił dumpa bazy i z niego ja odtwarzal.
Nigdy sie nie bawilem dumpem z mysql ale przykladowo na postgresie odtworzenie bazy 60MB+ zajmuje mi kolo 2min...
A z samym szukaniem z odpowiednimi idexami nie powinno byc problemu z wydajnoscia.
danket
Witam!
Dzięki wielkie za podpowiedzi dotyczące problemu.
@phpion.com && @nekro - niestety, kompletnie nie mam dostępu do niczego niż zrzut bazy w podanej formie :/
@phpio.com - nie, w ściągnięciu pliku nie ma problemu, może niejasno się wyrazilem, łącza są na tyle szybke, że gigowe pliki wręcz fruwają smile.gif
@tomeksobczak && @netmare - dzięki za info o bazach, ukoiliście moje skołatane stare serce smile.gif Tak jak napisałem, nigdy nie musiałem pracować na bazach większych niż 1000/2000 rekordów więc 100,000 wydawało mi się czymś ogromnym smile.gif

Jeszcze raz dzięki, po skończeniu podeślę rozwiązanie, może się przyda na forum.

Dan
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.