Schnelles arbeiten mit großen CSV Dateien

Siassei

Bekanntes Mitglied
Hallo,

auf einem Prüfstand entstehen sehr große CSV Dateien mit mehreren hundert Spalten und noch mehr Zeilen. Die Dateigröße schwankt zwischen 300 GB und 2 TB.
Die beinhalteten Dateien verarbeite ich weiter. z.B. statistische Auswertung, "Ausgleichsgeraden" bzw. mehrdimensionale Flächen.

Leider ist meine Erfahrung in Java mit derart große Dateien begrenzt. Daher suche ich zur Zeit eine Möglichkeit, die Daten möglichst "schnell" einzulesen. Mein ersten Gedanken waren
1.) Ich erstelle ein Register, in dem ich mir die Positionen (Offsets) für die Zeilen und Spalten merke. Danach greife ich einfach an der i-ten Zeile und j-ten Spalte den Wert ab.
2.) Ich schreibe alle Daten in eine DB z.B. H2 und arbeite mit dieser weiter.

In wie weit liege ich damit richtig?
Zu 2.)
Wie arbeite ich mit einer DB bei der mathematischen Auswertung zusammen?
z.B. bei der Erstellung einer 2D Fläche (Anpassung mit Ansatzfunktion)

Gruß, Thomas
 
Hi,

also solche Größenordnungen hören sich eher nach einem kleinen Hadoop Cluster mit Map/Reduce an....

Ich würde vermuten, dass Du damit DB's gegen die Wand läufst...(300 GB ist schon sehr groß geschweige 2 TB) ...Die Frage ist auch wie lange das brauchst um in die DB zu wandern....

CSV ist ja zeilenorientiert und somit sollte zumindest das Lesen kein Problem sein....

Eventuell wäre hier sogar noch eher an Hive zu denken...das ist das Ganze SQL-Like ist....

Die Frage ist ob man die Mathematischen Themen in Map/Reduce abgebildet bekommt....(Eventuelle mit Hive?)

Die Frage ist auch welche Geschwindigkeiten Du Dir vorstellst und wieviel Zeit Du zur Auswertung hast ? Must Du eventuell die Auswertung unterschiedlich machen?

Gruß
Karl Heinz Marbaise
 
Zuletzt bearbeitet:
Hi,
1.) Ich erstelle ein Register, in dem ich mir die Positionen (Offsets) für die Zeilen und Spalten merke. Danach greife ich einfach an der i-ten Zeile und j-ten Spalte den Wert ab.
Was aber bedeutet, dass Du die Daten vollständige lesen musst...damit Du solch einen Index erstellen kannst....

EDIT: So dann hast Du einen Index...aber um die Daten dann zu verarbeiten musst Du nochmal durch die Daten und durch den Index ? Hm...? Wird sehr langsam....bei der Menge...

Gruß
Karl Heinz Marbaise
 
Die Frage ist auch was mit den Daten passieren muss.
Musst du nur einmal durchlaufen um irgendwelche Werte zu berechnen, oder musst du auf bestimmte Datensätze zugreifen?
Wenn du nur einmal durchlaufen musst ist der einfachste Weg Chunk für Chunk zB mit einem ByteBuffer durchzugehen und die Daten zu verarbeiten. Wenn aber auf einzelne Datensätze gezielt zugreifen musst währe ein Index aus dem du die Offsets und Längen auslesen kannst wohl wirklich geschickter. In dem Fall dann zB mit einem NIO Filechannel direkt den richtigen Chunk der Datei in den Speicher mappen und dann verarbeiten.
 

Zurück
Oben