Input/Output Arbeiten mit extrem vielen Dateien

Marc T.

Bekanntes Mitglied
Hallo,

ich muss unglaublich viele Dateien erstellen (so ca. 43 Millionen).
Inhalt der Dateien sind serialisierte Objekte.
Das läuft jetzt ungefähr so:

Ich habe eine 230GB große Datei mit völlig unsortierten Daten, die
im RDF-Format, also in Triples, gespeichert sind. Jedes Triple bezieht
sich dabei auf ein bestimmtes Objekt identifiziert durch eine ID.

Also z.B.

xyz name tom
abc typ baum
...

Ich nehm mir also die ID, gucke ob die Datei schon vorhanden ist
(deserialisiere), schreibe die neuen Daten ins Objekt und schreibe
sie dann auf die Festplatte (serialisiere).

Das ganze geht am Anfang natürlich schnell, jetzt wo ich bereits bei
1.4 Millionen erzeugten Dateien bin benötigt das Programm aber
schon eine Sekunde um eine Datei zu erstellen. Da warte ich ewig.

Wie gehe ich also am besten mit dieser Menge an Dateien um,
damit das ganze schneller geht.... denn mal ehrlich, noch 40 Millionen
Sekunden warten... naja ^^
 
hi,
das ist jetzt vielleicht nicht grad die lösung für dein problem, aber wenn es um performance geht, ist java in aller regel die falsche adresse. ich weiß leider überhaupt nicht, was du bei deiner aufgabe an zeit einsparen könntest.
nur mal ein keiner spontaner einfall von mir
javampir
 
Viele Dateien erstellen sollte für Java kein Problem sein 🙂
Java selbst ist nicht das schnellste, aber alle mal schnell genug für solche Sachen.
Das erstellen von Dateien kann aber auch durch die Hardware beschränkt sein (langsame Hardware -> Dateien können auch nur langsam erstellt werden).

Ich tippe darauf das das überprüfen ob die Datei schon vorhanden ist der Flaschenhals ist was die Performance angeht! Wie überprüfst du denn ob eine Datei schon vorhanden ist? Gehst du alle 1,4 Millionen Dateien durch und überprüfst den Namen oder vergleichst du mit einer Liste die dein Programm verwaltet?
 
Zuletzt bearbeitet:
43 Mio Daten müsste eine DB doch noch mit umkönnen,
ansonsten der Standard beim sortieren von großen Datenmengen (darin lässt sich dann auch viel leichter suchen) wäre es wohl die Datei anhand der ID auzuteilen.
Sprich du zerlegst die Datei anhand der ID nach dem Motto in Datei aaaaa kommen alle Werte die mit der ID aaaaa beginnen dann kommt aaaab uns so weiter.
Musst dir natürlich vorher ein bissel Gedanken um die Verteilung deiner IDs machen.
In den kleinen Dateien sollte sich dann auch zügig feststellen lassen ob der Eintrag schon vorhanden ist oder nicht.

Ansonsten musst dir ja ständig alle bisherigen Datensätze in den Speicher laden...
 
Der Flaschenhals ist hier nicht die Geschwindigkeit von Java, sondern die der Festplatte/des Dateisystems.
Am besten versuchst du das Ganze unter Linux, da geht das Erstellen einer großen Menge an Dateien um einiges schneller als unter Windows. Eine SSD hilft auch.
Außerdem solltest du einen möglichst großen Teil der Daten im RAM haben.

Und wieso fällt die Geschwindigkeit im Laufe der Zeit stark ab? Das lässt sich bestimmt irgendwie verhindern.
 
Zuletzt bearbeitet:
natürlich fällt die Zeit ab, er muss ja im Zweifel alle vorherigen Daten wieder durchsuchen um festzustellen ob der Datensatz schon da ist und das dauert bei mehr Daten länger. Und bei 230 gb Daten kannst du kaum nen großen Teil der Daten im Ram haben, geht halt darum den richtigen Teil der Daten wieder zu laden...darum ja das Aufteilen der Daten in einzelne Dateien.
 

Neue Themen


Zurück
Oben