PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : file parser (hört einfach auf...)


alexboy
28.04.2008, 11:54:06
hi,
ich habe einen parser gebaut, der ein csv file zeilenweise einliest, werte verändert und ein neues csv hinausschreibt. das funktioniert auch problemlos bei 'kleinen' files.

nur: wenn ich ein file mit zb 2.000.000 zeilen habe, dann bricht der parser einfach kommentarlos und ohne fehlermeldung bei - einmal 1.700.000 - einmal bei 1.800.00 etc. ab.
aber er schaffts nie durch. hat von euch jemand eine idee, was da los ist?

codebeispiel:


$handle = fopen ($importfile,"r");
$handle1 = fopen ($importfile1,"w");
$row = 0;
while(($data = fgetcsv ($handle, 4000, ",")) !== FALSE) {
$row++;
$line = "$data[0],$data[1],$data[2]\n";
echo("$row, ");
fwrite($handle1, $line);
}
fclose ($handle);
fclose ($handle1);
:

defabricator
28.04.2008, 12:01:41
if ($row%100==0) {
echo $row, ' ', memory_get_usage(), ' ', memory_get_peak_usage(), "\n";
}Steigt der Speicherverbrauch?

alexboy
28.04.2008, 12:05:12
thnx für den hinweis, werd ich gleich testen.
weiters probler ich auch gerade socket_set_timeout aus, ev. übersteig ich da die 'default' werte...

@Work
28.04.2008, 12:05:56
Hallo,

kann es bei ca. 2.000.000 Datensätzen vielleicht hiermit zusammenhängen?

set_time_limit (http://www.selfphp.de/funktionsreferenz/php_informationen/set_time_limit.php)

alexboy
28.04.2008, 12:08:44
also mit socket_set_timeout hats anscheinend nix zu tun.
memory steigt auch nicht (memory_get_peak_usage() konnte ich aber nciht aufrufen, kennt php net)

was ist da nur los??

alexboy
28.04.2008, 12:10:42
Hallo,

kann es bei ca. 2.000.000 Datensätzen vielleicht hiermit zusammenhängen?

set_time_limit (http://www.selfphp.de/funktionsreferenz/php_informationen/set_time_limit.php)

nein, hab ich auf 60*30 gestellt...

defabricator
28.04.2008, 12:20:15
socket_set_timeout?
Verwendest Du da irgendwo ein socket? Bspw. fopen('tcp://127.0.0.1', 'r')?

alexboy
28.04.2008, 12:52:57
nein, eh nicht.

defabricator
28.04.2008, 13:08:37
Testes Du immer die selbe Datei durch? Und bei dieser selben Datei bricht php mal hier mal da ab? Welche PHP Version benutzt Du?

alexboy
28.04.2008, 13:18:06
ich habs jetzt:

es ist die length bei fgetcsv


$handle = fopen ($importfile,"r");
$handle1 = fopen ($importfile1,"w");
$row = 0;
while(($data = fgetcsv ($handle, 4000, ",")) !== FALSE) {
$row++;
$line = "$data[0],$data[1],$data[2]\n";
echo("$row, ");
fwrite($handle1, $line);
}
fclose ($handle);
fclose ($handle1);


die hab ich hier auf 4000 - da dürften zeilen im csv länger werden, womit wie while schleife abbricht. setze ich das auf zb 8000 gehts problemlos.

was ist das eigentlich? bites? auf was kann man das maximal setzen?
hat das auswirkung, wenn ich da 100000 hinschreibe (auf memory etc.)

defabricator
28.04.2008, 13:21:43
Es gibt ein Onlinehandbuch zu allen (offiziellen) PHP-Funktionen.
http://de3.php.net/fgetcsv
lenght
Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters). It became optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP 5.0.4 and later) the maximum line length is not limited, which is slightly slower.
while(($data = fgetcsv ($handle, 0, ",")) !== FALSE) {

alexboy
28.04.2008, 13:34:36
aber den satz, dass ich das auf 0 auch stellen kann, hab ich net gefunden. nur den:
Length muss größer sein als die längste in der CSV-Datei vorhandene Zeile (um das Erkennen von EndOfLine (Ende der Zeile) Zeichen zu ermöglichen).

bei 0 brichts auch sofort ab...

defabricator
28.04.2008, 14:05:18
Dann hast Du eine veraltete PHP Version ;)

alexboy
28.04.2008, 16:08:20
also das wars alles irgendwie nicht.
habe jetzt mal das schreiben des files wegelassen und lese das ursprungsfile zeilenweise ein. das geht problemlos, erst wenn er jede zeile auch noch wegschreibt, blockiert er ...

keine ideen?