PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grosse Datei auf mysql-DB anwenden


myphoenixg
16.05.2008, 12:33:13
Hallo,

mir stellt sich ein Problem bei der Bearbeitung/Abarbeitung grosser Dateien.
Es geht um Folgendes:
Es sollen Daten ( Preise ), welche in einer mysql-DB gespeichert sind mit Daten aus einer Preislistendatei ( Grösse zwischen 1.5 und 1.8 MB ) abgeglichen werden und bei Änderungen die neuen Preise in die entsprechenden Felder der DB geschrieben werden.

Das Programm funktioniert genau so wie es soll, macht jedoch bereits nach ca 40 bis 50 verglichenen Artikeln aus der DB nicht mehr weiter.
Ich denke das dies evtl am zu hohen Speicherverbrauch liegt?
Rufe ich das Programm mit einer kleineren Preislistendatei auf, so funktioniert das bis zum Ende.

Sollten Vorschläge ( insbesondere solche, die auf schnelleren Programmablauf bzw weniger Ressourcenverbrauch abzielen ) vorhanden sein, bitte ich um Mitteilung.

Ein paar Details noch zum Server: System:Linux, memory-limit:32MB, output-buffering:4096 KB, post_max_size:8MB

Das Programm:

<?php
require("datenbankzugriff.inc.php"); // Datenbank öffnen
$filename = "pricelist.txt";
$handle = fopen ($filename, "r"); // öffnen Datei
$datei_inhalt = explode("\n",fread($handle, filesize($filename))); // Datei bis eof einlesen, Zeilen trennen
fclose ($handle); // Datei schliessen
$laenge_datei=count($datei_inhalt); // Anzahl Zeilen in eingelesener Datei
for ($aa=1;$aa<8;$aa++) { // Schleife über 7 Durchläufe
// (entsprechend 7 Tabellen in der DB)
switch($aa) {
case 1:$db="Tab1"; break; // Zuordnung Tabellennamen aus DB
case 2:$db="Tab2"; break; // --> jede Tabelle soll nacheinander
case 3:$db="Tab3"; break; // abgearbeitet werden
case 4:$db="Tab4"; break;
case 5:$db="Tab5"; break;
case 6:$db="Tab6"; break;
case 7:$db="Tab7"; break;
}
$anz_art=mysql_query("SELECT id FROM $db WHERE nr>100");
$laenge_db=mysql_num_rows($anz_art); // Anzahl Artikel
$art_arr="";
for ($pp=0;$pp<$laenge_db;$pp++) {
$auswahl=mysql_fetch_row($anz_art);
$art_arr[$pp]=$auswahl[0]; // Artikelarray mit allen ID's erstellen
}
for ($ii=0;$ii<$laenge_db;$ii++) { // Schleife über alle Artikel aus Tab
for ($uu=0;$uu<$laenge_datei;$uu++) { // Schleife über alle Zeilen der Pl-datei
$zeile_array = explode("\t", $datei_inhalt[$uu]); // Tabs aufschlüsseln
if ($art_arr[$ii]==$zeile_array[0]) { // Vergleich nr in DB==id in Pl
echo "<b>$zeile_array[0]</b> Daten gefunden<br>";
// an dieser Stelle stehen Datenzuweisungen für die Variablenúpdates
mysql_query("UPDATE $db SET ..>>o.a. Daten updaten<<.. WHERE id='$art_arr[$ii]'");
break; // Schleife verlassen (spart Zeit)
}
}
}
}
echo "Updates fertig";
mysql_close(); ?>

nem75
20.05.2008, 18:22:09
Wie wird das Programm den aufgerufen? Gibt es keine Fehlermeldung (auch mal in die error logs von php und mysql schauen)?

feuervogel
20.05.2008, 18:45:59
bitte nutze die [php]-tags.