mysqldac - EOutOfMemory bei großer Tabelle
-
Hi,
in meinem BCB5 verwende ich ebenfalls die MySQLDac Komponenten. Leider habe ich im Bezug auf großen Tabellen damit das erste mal meine Probleme.
Unter einer großen Tabelle verstehe ich eine Tabelle mit ca. 1,8 Millionen Datensätzen und einer Größe von ca. 3,7 GB.
Hier ein kleiner zusammengefasster Ausschnitt wie meine Abfrage aufgebaut ist.
String text; String sql = "select * from tmpcatalog"; try { Form1->SQLQuery2->Close(); Form1->SQLQuery2->SQL->Clear(); Form1->SQLQuery2->SQL->Add(sql); Form1->SQLQuery2->Open(); Form1->SQLQuery2->First(); while (!Form1->SQLQuery2->Eof) { text = Form1->SQLQuery2->FieldByName("xml")->AsString; xml_file = Form1->SQLQuery2->FieldByName("file")->AsString; if (ParseXML(text) == false) { return false; } Form1->SQLQuery2->Next(); } } catch(...) { ShowMessage("tmpcatalog konnte nicht verarbeitet werden"); return false; }Bei 500.000 Datensätzen braucht er einige Minuten, bis er anfängt alle Datensätze in der Schleife zu verarbeiten. Bei allen Datensätzen kommt nach vielen Minuten eine EOutOfMemory Exception. Da sind 1,5 GB wohl zu wenig RAM im Rechner.
Im PHPMyAdmin braucht die Abfrage nur 0,4s. Gibst irgendeine Möglichkeit, dass er nicht alles sofort in den Speicher lädt, sondern sich immer via den Next Aufruf das nächste Element lädt.
Ansonsten müsste ich die Anwendung so umbauen, dass immer nur Max limit 500.000 Datensätze verarbeitet werden.
Vielleicht hat ja jemand sonst noch eine Idee oder selbst Erfahrung mit größeren Datenmengen.
Beste Grüße
Philipp
-
Lies dir masl das da genau durch... vielleicht is das was für dich...
-
Die Frage wäre wohl eher was für den Hersteller der Komponenten.
-
Kannst Du die Query auf einen serverseitigen Cursor umstellen?