ArrayList<double[]> persitent anlegen

Tembudrus

Mitglied
moin moin,

ich stehe vor folgenden n sich recht simplen Problem.

Ich schreibe an einem Algorithmus, der Datensätze von bis zu mehreren Gigabyte verarbeiten muss. Diese will ich nicht ständig im Arbeitsspeicher liegen haben, sondern immer nur ein paar 100k Samples. Die Daten liegen grundsätzlich in der Form (x,y) oder (x,y,z) vor, sollen also pro Sample als double[] gespeichert werden.

Jetzt schweben mir zwei Verfahren vor:

1) Ich speichere die Daten in einer Datenbank und lese von dort immer den gerade benötigten Sample aus. Dazu die Frage, wie schnell ist ein solches Auslesen? Ich habe noch nicht mit Datenbanken gearbeitet, bräuchte also etwas Zeit mich einzuarbeiten und dazu muss es dann zumindest schnell sein.

2) Ich lege eine (temporäre) Datei für jede Liste an. In der Datei werden die Samples jeweils hintereinander weg als Double mit einem RandomAcessFile gespeicher und gelesen. Ich halte jeweils einen gewissen Teil des Datensatzes in einem internen Buffer. Meistens muss ich die Daten sequenziell auslesen, so dass ich auf diesem weg nur dann denn Buffer neu lesen müsste, wenn ich auf einen Wert zugreife, der außerhalb liegt (was dan ja selten vorkäme).
Sollte der Buffer größer als der Datensatz sein, so wird nie auf die Festplatte zugegriffen, da auch erst dann auf die Festplatte geschrieben würde, wenn der Buffer voll ist.

Ich frage mich dazu: Welches Verfahren ist portabler, schneller (über DB weiß ich leider nichts), etc.. Kennt ihr evtl. eine Library die etwas ähnliches umsetzt?

ich wäre euch für eure Hilfe sehr dankbar!!!

Mit besten Grüßen

Tembudrus
 

Empire Phoenix

Top Contributor
Hypersql ist eine embedded db für java, die schön schnell ist, die würde sich denk ich eigenen. und da pure java auch auf jedem pc mit jvm lauffähig.

Ohne garantie, aber ich gehe davon aus, dass die db deutlich geeigneter ist, da dort wesentlich intelligentere algorithmen für die optimierung vom lesen und schreiben arbeiten, als du sie mal eben erfinden kannst.
(Soweit ichw eiß kann hsql hybride tabellen, die teilweise innen memory gecacht sind und teilweise auf ner file, um die interne verwaltung kümmert der sich selber. -> Oft benötigte sätze liegen im ram, selten benötigte werden nachgelese)

Wenn du blockdaten brachst un entsprechen den query so formulierst dass der dir nicht nur einen Wert, sondern gleich einige tausend bringt, kann die db auch festplattenzugriffsmuster optimieren ect.

Das ganze sähe dann so aus
-> alles inserten.

Select * from Werte where x<blockendex AND x>blockstartx AND y<blockendey AND y > blockstarty;
(Wenn das als prepared STatement gemacht wird, kann man auch den parsingoverhead auf 1 einzigen aprse vorgang optimieren)

Allgemein kann es soeiso nicht schaden wenn du mit Datenbanken arbeiten kannst, zumindest auf basisebene, da die dir noch oft im leben begegnen werden.
 
Zuletzt bearbeitet:

Tembudrus

Mitglied
Danke für den Hinweis. Nun würde ich ja in einer solchen Datenbank eine Tabelle anlegen mit bis zu 600.000.000 eventuell sogar einer Milliarde Einträgen jeweils bestehend aus 2 oder 3 Doubles. Kannst du aus Erfahrung abschätzen, ob sich ein solches Konstrukt noch realisieren lässt in einer Datenbank?
 

Empire Phoenix

Top Contributor
Aus deren FAQ

What is the biggest known HSQLDB database?

The current (2.2) size limit of an HSQLDB database is 2 TB (by default) for all CACHED tables and 2GB for each TEXT table. If you use large MEMORY tables, memory is only limited by the allocated JVM memory, which can be several GB on modern machines and 64bit operating systems. We have performed extensive tests with the latest versions using the TestCacheSize and other test programs inserting millions of rows and resulting in data files of up to 16 GB and larger LOB sizes. Users have reported the use of databases with up top 900 million rows.

Solle demnach eigentlich noch alles passen wären dann ja ungefähr 22,4 GB daten, und somit weit unterhalb der 2 TB (Das andere limit gilt ja nur für TEXT daten)


Wenn du dich an SQL99 oder SQL 92 hälst bei den anfragen, hat das ganze noch den vorteil das auch andere SQL compatible Datenbaken genommen werden können, wenn die performance nicht ausreicht. Evtl ist für dienen einsatz eine vollwerte serverbasierte schneller.

Je nach umfang der berechnungen kannst u übrigens einige auf die DB auslagern (summen, gruppierungen ect) Bei enstrechend intelligenten DB system würde das dann dafür nach einigen läufen zwischenergebnisse materialisieren. (zumindest machen das einige dedicated DB's so, weiß nicht ob das für hsql auch gilt.)
 
Zuletzt bearbeitet:

Tembudrus

Mitglied
Dank dir! Das klingt sehr vielversprechend und sollte ausreichen.

Nun habe ich noch eine letzte frage, nachdem ich mir einige Tutorials durchgelesen habe. In all diesen Tutorials wird davon ausgegangen, dass eine Datenbank bereits existiert.

Ich möchte aber, dass die Datenbank beim Start des Programmes neu angelegt wird. Wenn schon eine Datenbank existiert, so würde ich ja die Zeilen:

Code:
Class.forName( "org.hsqldb.jdbcDriver" );
 Connection con = null;
 con = DriverManager.getConnection("jdbc:hsqldb:PATHTODATABASE, "NUTZERNAME", "PW" );

Wie müsste ich vorgehen, wen ich eine entsprechende Datenbank vor den oben genannten Zeilen erst anlegen wollen würde? Ist dies einfach mit einem JAVA-Befehl umzusetzen?

Grüße
 

Tembudrus

Mitglied
Hat sich geklärt. Ein Blick in de FAQs hätte mir geholfen :)

How to create a new database

A new database is created automatically if it does not yet exist. Just connect to the not-yet-existing database using the jdbc:hsqldb:file:«database-path» URL (should replace the last part with the path you want) with the user 'sa' (or any name) and a password (can be an empty string). You will use this name and password to connect again.
 

Tembudrus

Mitglied
Hallo nochmal,

ich habe am Wochenende die Datenbank fast vollständig implementiert. Weitere Recherche ließ bei mir aber Zweifel an der Performance aufkommen. Noch folgendem Link (hier) liegt die Zeit für eine Änderung in der Datenbank im ms Bereich. Kann mir jemand sagen, ob solche Werte realitätsnah sind?

In dem Fall wäre die Datenbank viel zu langsam für mich. Ich habe jetzt eine Alternative geschrieben, die mit RandomAccessFile arbeitet und in etwa 1000 double-Paare pro MILLISekunde lesen und schreiben kann (sequentiell). Der Random-Zugriff liegt immer noch bei ca. 700 double-Paaren pro MILLISekunde. Hier ist auch sicherlich noch Luft nach oben.

Ich werde den Code evtl. mal hochstellen, wenn es eine solche Methode noch nicht geben sollte.
 

Empire Phoenix

Top Contributor
Hm ja 1ms oder vergleichbar ist durchaus noch normal. Aber wenn das mt dem File besser geht, dann mach das so, hätte jetzt aber gedacht das wäre langsamer. Kann sein, weil du selber logic drinnen hast, die mehr infos als die DB hat, (also im sinne von das du immer blockweise arbetest oder so.

Die frage wie holst du einen Wert aus der db? Einzeln oder gleich mehrere hundert? Weil Datenbanken werden dramatsich schneller, wenn du mehr als nur einen Datensatz liest.
Ist dann noch die Frage, weil du von änderugen sprichst, updatest du viel in der Datanbank ? Oder liest du hauptsächlich? Zudem sind die Keys sinnvoll gesetzt, so das die DB die Datenstrukture optimieren kann?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Noahscript Konto anlegen um JDK herunterzuladen? Was soll das? Allgemeine Java-Themen 1
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
A Datenstrukturen richtig anlegen/laufzeitanalyse Allgemeine Java-Themen 10
M Klassen Systemprozess anlegen Allgemeine Java-Themen 3
B Java FTP (common net - user anlegen) Allgemeine Java-Themen 2
H Ordnerstruktur anlegen Allgemeine Java-Themen 10
G Ordnerstruktur anlegen Allgemeine Java-Themen 2
H2SO3- dynamisches anlegen der dimensionaltität eines arrays Allgemeine Java-Themen 6
S Problem beim Anlegen eines JDialogs! Allgemeine Java-Themen 4
MQue Ordner anlegen Allgemeine Java-Themen 7
V Neues Objekt anlegen, welcher Typ? Allgemeine Java-Themen 2
M JFileChooser: Ordner anlegen Allgemeine Java-Themen 3
C Temporäre Datein anlegen Allgemeine Java-Themen 2
E Problem beim Anlegen einer Datei Allgemeine Java-Themen 4
B Datenbank anlegen Allgemeine Java-Themen 10
G FileOpenDialog Pfad anlegen? Allgemeine Java-Themen 2
S In .jar File Verzeichnisse anlegen Allgemeine Java-Themen 2
D Datei beim ersten Programmstart anlegen? Allgemeine Java-Themen 3
S Temporäres Verzeichnis anlegen? Allgemeine Java-Themen 4
F Das Anlegen von Objekt-Instanzen... Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben