Hi,
Hintergrund:
Ich analysiere Börsendaten aus der Vergangenheit über Sinn bzw. Un-Sinn hier bitte nicht diskutieren
Ich habe diese Daten im csv Format vorliegen. Einmal die Werte von jedem Tag und einmal jeden einzelnen Tick pro Tag.
Die csv von den Tagen hat ein paar Megabyte, das ist kein Problem, aber die Datei mit den Ticks hat ca. 5 Gigabyte. Ich lese zuerst die Tagesdaten aus und speichere sie in ein entsprechendes Objekt:
Je nach "Testfall" gibt es in dem Objekt auch noch 4-5 weitere Felder, booleans oder auch BigDecimals.
Dann lese ich die Tickdaten aus und speichere sie in die Klasse CandleStickTick und die schaut so aus:
Danach mappe ich dann alle Ticks zu den Tagesdaten, die ArrayList wird dann befüllt.
Wenn ich das alles getan habe, habe ich eine Arbeitsspeicherauslastung von über 50GB!
Dann verarbeite ich die Daten in mehreren Threads mit unterschiedlichen Ausgangsparametern.
Problem:
Wieso ist die Auslastung so extrem hoch? Also das 10-fache von der csv Datei? BigDecimal wird vermutlich teuer sein? Wie viel teurer als ein int? Ich habe nicht nur ganze Zahlen könnte aber mit einem entsprechenden Faktor auf eine kommen und somit einen int verwenden, aber wie viel spare ich damit?
Eine Datenbank verwenden? Da ich aber mehrere Threads verwende (8Kerne / 16 Threads) könnte es hier ja zu Problemen kommen? Ich brauche nicht immer alle Ticks...demnach könnte ich dann immer mit einem Statement auf die DB gehen und mir immer nur die Ticks holen die ich aktuell brauche. Läuft das Programm dann aber immer noch so schnell? 1 Thread braucht aktuell ca. 0,5-1 Sekunde. Wenn ich jetzt z.B. an 500 Tagen die Ticks brauche, dann brauche ich ja schon 500 DB Zugriffe in dem Thread. Vermutlich ist das dann deutlich langsamer?
Bevor ich jetzt anfange und ein paar Sachen davon ausprobieren, habe ich hier mal nachgefragt. Vielleicht hat jemand ja noch eine viel bessere Idee
Wenn ich die Speicherauslastung runterbekomme, dann kann ich noch mehr Daten auf einmal testen. Alternativ müsste ich mir sonst einen Threadripper kaufen und 128 Gigabyte Speicher. Klar 32 Kerne und 128 Gigabyte Speicher macht es so oder so schneller, aber eventuell bekomme ich ja eine Performance hin, die mit 8 Kernen und 64 Gigabyte auch in Ordnung ist
Danke!
Hintergrund:
Ich analysiere Börsendaten aus der Vergangenheit über Sinn bzw. Un-Sinn hier bitte nicht diskutieren
Ich habe diese Daten im csv Format vorliegen. Einmal die Werte von jedem Tag und einmal jeden einzelnen Tick pro Tag.
Die csv von den Tagen hat ein paar Megabyte, das ist kein Problem, aber die Datei mit den Ticks hat ca. 5 Gigabyte. Ich lese zuerst die Tagesdaten aus und speichere sie in ein entsprechendes Objekt:
Java:
private LocalDateTime date;
private BigDecimal open;
private BigDecimal high;
private BigDecimal low;
private BigDecimal close;
private List<CandleStickTick> listCandleStickTick = new ArrayList<>();
Je nach "Testfall" gibt es in dem Objekt auch noch 4-5 weitere Felder, booleans oder auch BigDecimals.
Dann lese ich die Tickdaten aus und speichere sie in die Klasse CandleStickTick und die schaut so aus:
Java:
private LocalDateTime date;
private BigDecimal ask;
private BigDecimal bid;
Wenn ich das alles getan habe, habe ich eine Arbeitsspeicherauslastung von über 50GB!
Dann verarbeite ich die Daten in mehreren Threads mit unterschiedlichen Ausgangsparametern.
Problem:
Wieso ist die Auslastung so extrem hoch? Also das 10-fache von der csv Datei? BigDecimal wird vermutlich teuer sein? Wie viel teurer als ein int? Ich habe nicht nur ganze Zahlen könnte aber mit einem entsprechenden Faktor auf eine kommen und somit einen int verwenden, aber wie viel spare ich damit?
Eine Datenbank verwenden? Da ich aber mehrere Threads verwende (8Kerne / 16 Threads) könnte es hier ja zu Problemen kommen? Ich brauche nicht immer alle Ticks...demnach könnte ich dann immer mit einem Statement auf die DB gehen und mir immer nur die Ticks holen die ich aktuell brauche. Läuft das Programm dann aber immer noch so schnell? 1 Thread braucht aktuell ca. 0,5-1 Sekunde. Wenn ich jetzt z.B. an 500 Tagen die Ticks brauche, dann brauche ich ja schon 500 DB Zugriffe in dem Thread. Vermutlich ist das dann deutlich langsamer?
Bevor ich jetzt anfange und ein paar Sachen davon ausprobieren, habe ich hier mal nachgefragt. Vielleicht hat jemand ja noch eine viel bessere Idee
Wenn ich die Speicherauslastung runterbekomme, dann kann ich noch mehr Daten auf einmal testen. Alternativ müsste ich mir sonst einen Threadripper kaufen und 128 Gigabyte Speicher. Klar 32 Kerne und 128 Gigabyte Speicher macht es so oder so schneller, aber eventuell bekomme ich ja eine Performance hin, die mit 8 Kernen und 64 Gigabyte auch in Ordnung ist
Danke!