Ich schreibe einen ziemlich CPU-intensiven, parallelen numerischen Code, der große Datenmengen verarbeiten wird, die in Java-Arrays gespeichert sind (z. B. viele doppelte [100000] s). Einige der Algorithmen können meh- rere Male über mehrere Tage laufen, so dass eine maximale stationäre Leistung eine hohe Priorität hat.Optimieren der Verarbeitung und Verwaltung großer Java-Datenarrays
Im Wesentlichen ist jeder Algorithmus ein Java-Objekt, das eine Methode API so etwas hat:
public double[] runMyAlgorithm(double[] inputData);
oder alternativ eine Referenz auf das Array übergeben könnte die Ausgangsdaten zu speichern:
public runMyAlgorithm(double[] inputData, double[] outputData);
Angesichts dieser Anforderung versuche ich, die optimale Strategie für die Zuweisung/Verwaltung von Array-Speicherplatz zu bestimmen. Häufig benötigen die Algorithmen große Mengen an temporärem Speicherplatz. Sie nehmen auch große Arrays als Eingabe und erstellen große Arrays als Ausgabe.
Unter den Optionen Ich erwäge sind:
- immer neue Arrays als lokale Variablen zuweisen, wenn sie (zum Beispiel neue Doppel [100000]) benötigt werden. Wahrscheinlich der einfachste Ansatz, aber wird eine Los Müll produzieren.
- Temporäre Arrays vorab zuweisen und sie als letzte Felder im Algorithmusobjekt speichern - großer Nachteil wäre, dass dies bedeuten würde, dass nur ein Thread den Algorithmus zu einem bestimmten Zeitpunkt ausführen könnte.
- Behalten Sie zuvor zugewiesene temporäre Arrays im ThreadLocal-Speicher bei, sodass ein Thread bei Bedarf einen festen Anteil an temporärem Array-Speicherplatz verwenden kann. ThreadLocal wäre erforderlich, da mehrere Threads denselben Algorithmus gleichzeitig ausführen.
- Übergeben Sie viele Arrays als Parameter (einschließlich der temporären Arrays für den Algorithmus). Nicht gut, da es die Algorithmus-API extrem hässlich macht, wenn der Aufrufer für die Bereitstellung von temporärem Array-Platz verantwortlich sein muss.
- Verteilen Sie extrem große Arrays (z. B. double [10000000]), stellen Sie aber auch den Algorithmus mit Offsets zur Verfügung Array, so dass verschiedene Threads unabhängig voneinander einen anderen Bereich des Arrays verwenden. Offensichtlich wird Code benötigt, um die Offsets und die Zuweisung der Array-Bereiche zu verwalten.
Irgendwelche Gedanken darüber, welcher Ansatz am besten wäre (und warum)?