Mysql Große Tabelle auslesen



  • Hallo zusammen,

    ich habe ein Problem und zwar möchte ich eine Tabelle die ca. 4 Millionen Datensätze hat auslesen und mit diesen Daten etwas kurz machen. Mein Problem ist, dass ich beim normalen auslesen in ResultSet sehr viel Speicher brauche (ca. 650MB/Prozess), vor allem wenn ich diese Prozesse mehrmals parallel laufen lassen möchte. Ich könnte das auch Zeilenweise auslesen, jedoch sperre ich für diesen Moment die Tabelle und kann dort eben keine Daten modifizieren. Ich habe schon darüber nachgedacht die Daten in eine CSV-Datei abzulegen und mit dieser zu arbeiten. Lösbar wäre es, auch wenn ich die Daten per PHP auf meiner Homepage zeigen möchte. Nur das Modifizieren der Daten ist nicht so einfach, da ich nicht beliebig in die Zeilen springen kann.

    Hat jemand vielleicht ein Idee wie man das ganze intelligent und effektiv nutzen kann? Ich kann ja schlecht einen Server mit 20 GB RAM kaufen.

    Gruß
    Basti



  • Hallo JavaNewbie,

    Ich bin zwar, speziell was JAVA angeht, auch ein Einsteiger, habe aber (mehr als mir manchmal lieb ist) doch viel mit Datenbanken zu tun.

    Die ganze Problematik sieht mir auf den ersten Blick mehr als DB-Problem denn als ein JAVA-spezifischens Problem aus.

    Um hier weitere Lösungsansätze zu finden, wären folgende Informationen sehr hilfreich:

    - Welche Datenbankanbindung nutzt Du ? JDBC(ODBC), Native DB-Treiber ?

    - welches DB-System wird verwendet ?

    - werden wirklich ALLE Datensätze (unmodifiziert) auf einmal gebraucht ?
    (Meistens werden ja nur Daten gebraucht die bestimmten Kriterien entsprechen, und dann wird nur dieses Ergebnis als Resultset weitergegeben (Vorauswahl durch den Datenbank-Server))

    - welche Aktionen werden auf diese Datensätze angewendet ?
    (bleiben die Datensätze UNVERÄNDERT und bilden nur den Ausgangspunkt für irgendeine Aktion basierend auf den Werten dieser Daten,
    oder werden Daten dieser DB dauerhaft geändert ?

    Bei bestimmten Änderungen kann man sich wirklich das Einlesen in ein Resultset ersparen und dat janze dann direkt auf der Tabelle machen z.B. UPDATE für ALLE Datensätze oder für alle Datensätze, die bestimmten Kriterien entsprechen, etc. Hier würde dann einfach das Senden des SQL-Statements an den Server genügen...)
    (nachdem es vorher an der SQL-Konsole oder ähnlichem an Testdaten ausgiebig getestet wurde, gelle 🙂 !!)

    - wirken sich Änderungen des ersten Datensatzes auf die nachfolgenden aus ?
    (wenn nein, wäre "häppchenweise" Einlesen, so 200.000 auf einmal, auch eine gängige Praxis)

    Viele Grüße

    Der kleine Programmierer



  • EDIT:

    man sollte genau lesen ..... 😃

    DB-System ist ja genannt ......MYSQL.

    So früh am Morgen sollte man augenscheinlich noch nix machen .. 😉

    Der kleine Programmierer



  • Wenn die Änderungeslogik nicht zu komplex ist könnte man auch die Verwendung von stored procedures in Betracht ziehen.



  • Hi,

    also ich nutze mysql mit jdbc. Es sind wirklich 4 Millionen Datensätze die ich auf einmal alle nacheinander abarbeiten muss. Nachdem ich diesen Datensatz kontrolliert habe muss ich mit einem Update eine Flanke setzen, dass dieser Datensatz bereits kontrolliert wurde.

    Hilft dir das weiter ?



  • Ach und Stored Procedures nutze ich auch für die Update Funktion. Nur das geht halt, wenn ich ein ResultSet nutze und alle in den Speicher lade. Bei unbuffered ResultSet, wenn ich also zeile für zeile die Datensätze auslese ich die Tabelle ja gesperrt und da kann ich kein Update machen.



  • LIMIT



  • JavaNewbie schrieb:

    Ach und Stored Procedures nutze ich auch für die Update Funktion. Nur das geht halt, wenn ich ein ResultSet nutze und alle in den Speicher lade. Bei unbuffered ResultSet, wenn ich also zeile für zeile die Datensätze auslese ich die Tabelle ja gesperrt und da kann ich kein Update machen.

    Ups, standardmäßig ist doch bei Bearbeitung einer Tabelle nur eine Sperrung auf Datensatzebene aktiv.
    (Man kann durchaus die ganze Tabelle sperren - aber Standardeinstellung ist nun mal Datensatzebene)

    Wenn die Prüfung des Datensatzes "mechanisiert" mittels Stored Procedures möglich ist, nur ein Bearbeitungs-Flag gesetzt werden muss und das Locking auf Datensatzebene eingestellt ist, sollte sich doch das Resultset eichentlich erledigt haben.

    Oder hab ich da in Bezug auf JAVA/SQL irgendeine Besonderheit übersehen... ??

    Grüße

    Der kleine Programmierer

    P.S. welche Tabellenengine wird denn verwendet ? MyIsam,Immo-DB, Berkely ??


Anmelden zum Antworten