Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Parsowanie bardzo dużych plików
Forum PHP.pl > Forum > PHP
dado
chciałem zapytać bardziej rozeznanych w temacie - mam do parsowania pliki txt po 600/1000 MB. W tym momencie stosuję funkcje file i substr ale przy tak dużych plikach php wymięka, time limit na długie godziny memory limit ile sie da czyli 2 gb. Miał ktoś może z was podobny problem ?
Będę wdzięczny za każdy pomysł.
pyro
Cytat(dado @ 27.03.2008, 22:57:22 ) *
chciałem zapytać bardziej rozeznanych w temacie - mam do parsowania pliki txt po 600/1000 MB. W tym momencie stosuję funkcje file i substr ale przy tak dużych plikach php wymięka, time limit na długie godziny memory limit ile sie da czyli 2 gb. Miał ktoś może z was podobny problem ?
Będę wdzięczny za każdy pomysł.


użyj set_time_limit();
Cysiaczek
Co konkretnie oznacza , że "wymięka"?
dr_bonzo
OMG, przeciez file laduje od razu caly plik do pamieci to nic dziwnego ze sie wlecze.

uzyj fopen() + fread() + innych operujacych na strumieniu, bo czytaja plik po fragmencie i nie trzymaja calej jego zawartosci w pamieci
dado
Wymięka to akurat w tym przypadku oznacza powieszenie komputera (localhost). set_time_limit() - już na 2h.
Jasne że pobieranie strumieniowe jest bardziejsze w tym przypadku tylko nie jak je zrealizować.
Przykładowe dane wyglądają tak
Kod
001369825grecja   0125granada    025***hotel piersonada025 456875 45357 00 21 35 0000 554
001369825grecja   0125granada    025***hotel piersonada025 456875 45357 00 21 35 0000 554
001369825grecja   0125granada    025***hotel piersonada025 456875 45357 00 21 35 0000 554
001369825grecja   0125granada    025***hotel piersonada025 456875 45357 00 21 35 0000 554
001369825grecja   0125granada    025***hotel piersonada025 456875 45357 00 21 35 0000 554
...


i teraz muszę pobrać zawsze pełną paczkę danych czyli kończąca się enterem
czyli jeśli wiem że wiersz ma np: 47bajtów to

  1. <?php
  2. $start = 0; 
  3. $pakiet=47; 
  4. $liczbawierszy=300000;
  5. $paczka = file_get_contents("1000mb.csv", FALSE, NULL, $start, ($pakiet * $liczbawierszy) );
  6. ?>

to mocno uproszczone ale czy to dobre myślenie ?
Pilsener
pl.php.net/manual/pl/function.fgets.php
dr_bonzo
W ogole wyglada to jak CSV, i masz do tego masz funkcyjke fgetcsv czy jakos tak, i nie file_get_contents!!! RTFM, on przeciez tez wszystko od razu wczytuje do pamieci.
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.