Ich habe eine Java-Anwendung, die intensiv mit 2D-Float-Arrays (float[][] Arrays) arbeitet, die tatsächlich Bilder auf schwarzem Hintergrund halten. Beide Dimensionen sind gleich (quadratisch) und sind eine Potenz von 2 (meistens 256, 512, 1024), sodass die Bereiche nahe den Rändern in den meisten Fällen Nullen haben.
Die Größen, die eine Potenz von 2 sind, dienen zur Steigerung der Leistung (es gibt eine FFT) und zur Verringerung der Komplexität bei Operationen über diese Arrays wie Rotation usw. Kürzlich hatte ich auf meinem 6GB-Maschine einen Mangel an Heap für diese Anwendung. Nach meiner Berechnung sollte der Speicherverbrauch für diese Anwendung etwa 2-3GB betragen, während er 4-5GB erreicht (im Windows-Task-Manager nachgesehen). Ich habe den "YourKit"-Profiler verwendet und er zeigt an, dass diese Float-Arrays tatsächlich am meisten Speicher verbrauchen, jedoch sollte die Gesamtgröße dieser Float-Arrays grob etwa 1,3GB betragen (nun, ich weiß, dass es an der JVM liegt, wie die Daten gespeichert werden, aber ich habe nicht mit einem 2-3-fachen Unterschied im Speicherverbrauch gerechnet).
Ich habe versucht, die Daten mit dem Snappy-Kompressor auf die Schnelle zu komprimieren/dekomprimieren (und der Speicherverbrauch sinkt auf 3,5GB), aber die Leistung sinkt mehrfach, was nicht sehr akzeptabel ist. Außerdem habe ich die Leistung getestet, als ich diese floats[][] durch BufferedImage ersetzt habe, aber die Leistung war sehr schlecht.
Es gibt also 2 Möglichkeiten, die für mich funktionieren würden, um den Speicherverbrauch zu verringern: 1) Wrapper für float[][] Array schreiben, um bei "Nullen" Elementen zu sparen (es gibt viele "leere" Zeilen und Spalten) 2) von "Potenz von 2" abweichen
Beide Möglichkeiten erfordern ziemlich viel Codierung/Refactoring, daher während ich darüber nachdenke, "zu sein oder nicht zu sein" - habt ihr vielleicht eine bessere Idee zu diesem Problem, Leute?
Danke!