Virtueller Speicher

Christian S.

Mitglied
Hallo zusammen!
Ich schreibe an einem Java-Programm, daß sehr große Meßdaten verarbeiten muß.
Die Datenmenge ist so groß, daß sie nicht auf einmal in den Arbeitsspeicher passen.
Bietet Java von Haus aus oder mit Hilfe einer Library die Möglichkeit, eine Festplatte als virtuellen Speicher zu verwenden?

(Sprich, im Code muß ich nicht berücksichtigen, ob mein Programm gerade auf echten Speicher oder auf virtuellen Speicher zugreift.
Oder anders formuliert, ich lade die kompletten Meßdaten auf einmal und merke im Code gar nicht, daß ein Teil davon
im virtuellen Speicher liegt.)
 

temi

Top Contributor
Die direkte Antwort auf deine Frage kenne ich leider nicht, aber musst du denn wirklich alle Meßdaten auf einmal im Speicher haben?

Evtl. wäre es sinnvoller, über einen Weg nachzudenken, wie man das vermeiden kann und die Daten sequentiell bearbeitet.
 

Christian S.

Mitglied
Natürlich könnte ich die Daten auch sequentiell verarbeiten. Das würde aber alle Verarbeitungs-Algorithmen deutlich verkomplizieren, da ich z.B. die Daten resampeln und filtern, Events finden, oder Kenngrößen berechnen muß.
 

httpdigest

Top Contributor
Jedes Betriebssystem bietet die Möglichkeit, Festplattenplatz als Arbeitsspeicher zu gebrauchen. Das nennt sich "Swap"-Bereich bzw. Auslagerungsdatei. Unter Windows ist das die pagefile.sys Datei und unter Linux die swap Partition. Je nachdem, wie groß du diese wählst, können committete/physische Pages des Arbeitsspeichers dorthin ausgelagert werden.
Bezüglich "virtuell": Arbeitsspeicher wird dir vom Betriebssystem immer nur als virtueller Speicher angeboten und sobald eine Page/Seite des virtuell reservierten Arbeitsspeichers angefasst wird (gelesen/geschrieben), wird diese vom Betriebssystem "committet", also erst dann wird dafür tatsächlich physisch freier Speicher gesucht.
 

temi

Top Contributor
Das würde aber alle Verarbeitungs-Algorithmen deutlich verkomplizieren,

Würde es das tatsächlich?

Ich nehme jetzt mal was Einfaches an, wie z.B. einen Mittelwert zu bilden.

Du hast also eine List<Double> in der alle Werte sind und rufst im Algorithmus einen Wert nach dem anderen ab, um sie aufzusummieren und am Ende den Mittelwert zu erhalten.

Ob diese Liste jetzt alle Werte im Arbeitsspeicher hat oder es sich um eine FileAccessList<Double> handelt ist doch dem Algo egal. Er funktioniert genauso wie bisher. Allenfalls etwas langsamer. Aber die Schnittstelle des Zugriffs ist identisch!

Ich kann mir gerade nicht vorstellen, welcher Algorithmus gleichzeitig auf sämtliche Werte zugreifen muss (geschweige denn überhaupt kann).

Edit: Es gilt also die FileAccessList<> so zu gestalten, dass der Zugriff möglichst schnell funktioniert, z.B. indem intern immer ein ganzer Block geladen und bereit gestellt wird. Sobald der Block abgearbeitet wurde, wird der nächste geladen oder evtl. in einem separaten Thread bereits eingelesen, solange die Verarbeitung des ersten Blockes noch läuft.

Edit 2: Falls du auf bestimmte Stellen in den Daten zugreifen musst, dann musst du dir eine Struktur überlegen, mit der du indexbasiert arbeiten kannst oder du nimmst gleich eine DatabaseAccessList<> die im Hintergrund eine embedded Datenbank verwendet und importierst dir dorthin deine Messdaten. Dadurch kannst du den Zugriff gestalten, wie du ihn brauchst.
 
Zuletzt bearbeitet:

Christian S.

Mitglied
Ich finde es komplizierter weil:
Schritt 1, Daten filtern und resampeln: Es nutzt nichts, wenn ich die Meßdaten einfach nur abschnittsweise resample und filtere. Ich muß mit dem Ergebnis weiter arbeiten. Also müßte ich die geänderten Meßdaten als neue Meßdatendatei zwischenspeichern.
Generell ist es schwierig, abschnittsweise zu arbeiten, weil man nie einen Abschnitt separat bearbeiten kann.
Stell dir vor, im Abschnitt 2 hast du keinen Wert für die erste Stützstelle des neuen Resample-Rasters. Dann muß du auf den letzten Wert von Abschnitt 1 zurückgreifen. Oder auf mehrere letzte Werte, wenn du einen nicht-linearen Spline zum Interpolieren verwenden möchtest. Theoretisch könnte der vorletzte Wert auch schon im vorletzten Abschnitt liegen. Also mußt du dir doch mehrere Abschnitte merken, obwohl du ja abschnittsweise verarbeiten möchtest.
Schritt 2, Events erkennen: z.B. finde alle Snippets, bei denen von Gang 3 nach Gang 4 geschaltet wurde und die Geschwindigkeit schon seit mindestens 15 Minuten konstant über 50 km/ h liegt. Das kannst du nicht so ohne Weiteres schaffen, wenn du nur die Daten aus dem aktuellen Abschnitt anschaust. Da muß man auch auf die zeitlich früheren Daten zurückgreifen.
Klar, könnte man schon irgendwie programmieren. Aber deswegen sag ich ja, daß alle Algorithmen dann komplizierter werden.
Bisher (ohne sequentielle Verarbeitung) bilde ich logische Vektoren von den einzelnen Meßsignalen und Bedingungen an die Eventerkennung in den Meßdaten und kann diese dann verknüpfen und auch zwischenspeichern, damit man mit einer FileAccessList<Boolean>darauf zugreifen kann
 
Zuletzt bearbeitet:

Christian S.

Mitglied
Ich glaube, wir haben jetzt beide unsere Beiträge noch einmal editiert.
Damit es übersichtlicher wird, fange ich jetzt besser einen neuen Beitrag an.
Ich finde grundsätzlich deinen Ansatz mit einer FileAccessList<> sehr gut.
Vielen Dank für die Idee. So kann ich quasi virtuellen Speicher in Java simulieren,
ohne daß Java (offensichtlich) eine offizielle Möglichkeit dafür anbietet.
Bedenken muß ich nun, wie das ganze möglichst performant wird
und zweitens muß ich viele Zwischenergebnisse zwischenspeichern,
da ich in meinem Workflow mehrere Schritte hintereinander ausführe.
 

temi

Top Contributor
Ich glaube, wir haben jetzt beide unsere Beiträge noch einmal editiert.
Damit es übersichtlicher wird, fange ich jetzt besser einen neuen Beitrag an.
Ich finde grundsätzlich deinen Ansatz mit einer FileAccessList<> sehr gut.
Vielen Dank für die Idee. So kann ich quasi virtuellen Speicher in Java simulieren,
ohne daß Java (offensichtlich) eine offizielle Möglichkeit dafür anbietet.
Bedenken muß ich nun, wie das ganze möglichst performant wird
und zweitens muß ich viele Zwischenergebnisse zwischenspeichern,
da ich in meinem Workflow mehrere Schritte hintereinander ausführe.

:):):):)

Wichtig ist, dass du für den Zugriff auf die Daten ein entsprechendes Interface hast, mit dem der Verarbeitungsalgorithmus so auf die Daten zugreifen kann, wie er es für seine Arbeit benötigt.

Wie die Daten in der Datenhaltungsklasse dann gespeichert werden (ganz im Arbeitsspeicher, teilweise im Arbeitsspeicher und teilweise in einer Datei, ganz in einer Datei) kann dem Algorithmus völlig egal sein und macht für ihn keinen Unterschied.

Wenn du Daten (evtl. in der gleichen großen Anzahl) auch zwischenspeichern musst, dann brauchst du ja nur eine neue Datenhaltung zu instantiieren. Evtl. auch mit unterschiedlichen Speichermechanismen. Die Schnittstelle ist das entscheidende!

Data origin = new FileAccessDataStore();
Data puffer = new MemoryAccessDataStore();
Data resampled = new WasWeisDennIchDataStore();

"Data" ist jeweils das Interface und die drei Klassen dahinter sind konkrete Implementationen davon mit wechselndem Speichermechanismus.

Ich persönlich würde die Daten vermutlich in eine Datenbank importieren. Damit ist wahlfreier und schneller Zugriff möglich. Schau dir evtl. mal "H2" an .
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Es nutzt nichts, wenn ich die Meßdaten einfach nur abschnittsweise resample und filtere.
Es muss ja nicht in einzelnen Abschnitten gearbeitet werden, sondern einfach Streambasiert :)

Wenn dann irgendein Filter/Resampler/Whatever Daten aus der Vergangenheit braucht, speichert der sich die nötigen Werte einfach.

ZB für dein Event-Beispiel: der entsprechende Filter hat intern einfach einen Puffer, der das Tempo der letzten 15min enthält. Kommt ein neuer Wert rein, fliegen entsprechend die letzten raus. (Fände ich nicht mal komplizierter als die anderen Dinge)

Für dein anderes Beispiel gibts vermutlich auch Möglichkeiten, dass so zu lösen. Du bist ja nicht plötzlich bei Wert 15825816 und musst genau dann aus allen vorherigen einen passenden dazu raussuchen?
 

temi

Top Contributor
ZB für dein Event-Beispiel: der entsprechende Filter hat intern einfach einen Puffer, der das Tempo der letzten 15min enthält. Kommt ein neuer Wert rein, fliegen entsprechend die letzten raus. (Fände ich nicht mal komplizierter als die anderen Dinge)

Und nicht mal das wäre notwendig: Man muss sich nur einen Zeitstempel merken, wann die 50 km/h überschritten wurden und diesen aktualisieren, wenn der gültige Geschwindigkeitsbereich verlassen und wieder betreten wurde. Sobald dann das Schaltereignis kommt, muss man nur noch schauen, ob der Zeitstempel weit genug in der Vergangenheit liegt.
 

mrBrown

Super-Moderator
Mitarbeiter
Und nicht mal das wäre notwendig: Man muss sich nur einen Zeitstempel merken, wann die 50 km/h überschritten wurden und diesen aktualisieren, wenn der gültige Geschwindigkeitsbereich verlassen und wieder betreten wurde. Sobald dann das Schaltereignis kommt, muss man nur noch schauen, ob der Zeitstempel weit genug in der Vergangenheit liegt.
Stimmt, hatte irgendwie Durchschnitt im Kopf.
 

White_Fox

Top Contributor
Was ich gerne noch anfügen würde: Wenn du tatsächlich auf virtuellen Speicher zugreifen mußt (bzw. wenn Windows das für dich tut) bremst das dein Programm drastisch aus, insbesondere wenn der virtuelle Speicher auf einer herkömlichen HDD liegt. Dann wartest du 99% der Zeit auf IO-Operationen.

Von daher würde ich tunlichst alles versuchen, um mit dem vorhandenen Speicher auszukommen.
 

temi

Top Contributor
Was ich gerne noch anfügen würde: Wenn du tatsächlich auf virtuellen Speicher zugreifen mußt (bzw. wenn Windows das für dich tut) bremst das dein Programm drastisch aus, insbesondere wenn der virtuelle Speicher auf einer herkömlichen HDD liegt. Dann wartest du 99% der Zeit auf IO-Operationen.

Von daher würde ich tunlichst alles versuchen, um mit dem vorhandenen Speicher auszukommen.

Praktisch wird es sich nicht vermeiden lassen, die Daten in einer Datei zu halten und von dort auszulesen, zumindest wenn es sich um einen herkömmlichen PC handelt und es wirklich sehr viele Daten sind. Datenbanken legen ihre Daten ja auch i.d.R. im Filesystem ab.
 
X

Xyz1

Gast
Ich arbeite auch mit fetten Daten welche im Dateisystem abgelegt sind/werden - und es gibt dabei kaum Probleme. o_O
 

Christian S.

Mitglied
Auf jeden Fall habe ich viele Anregungen bekommen. Danke!
Mein Beispiel war nur ein Beispiel. Es kann andere Varianten der Meßdatenauswertung geben.
Z.B. finde alle Snippets, bei denen die Geschwindigkeit über einen Zeitraum t hinweg konstant ist (im Sinne von: Die Schwankungen müssen kleiner gleich einer bestimmten Konstante sein).
Wenn man den Algorithmus nicht weiter optimiert, hat er quadratischen Aufwand:
Fange beim ersten Meßpunkt x0 an. Dann mache eine Schleife über die nächsten Datenpunkte, solange wie die Schwankungen
noch im erlaubten Rahmen sind. Wenn die Schwankungen zu groß sind, breche ab und mache beim nächsten Meßpunkt x1 weiter. usw.
Quadratischer Aufwand heißt, daß die Performanz eine Rolle spielt. Im Auge des Betrachters ist natürlich relativ. Auf keinen Fall sollte der Anwender die Auswertung über Nacht laufen lassen müssen.
 

mrBrown

Super-Moderator
Mitarbeiter
Z.B. finde alle Snippets, bei denen die Geschwindigkeit über einen Zeitraum t hinweg konstant ist (im Sinne von: Die Schwankungen müssen kleiner gleich einer bestimmten Konstante sein).
Wenn man den Algorithmus nicht weiter optimiert, hat er quadratischen Aufwand:
Fange beim ersten Meßpunkt x0 an. Dann mache eine Schleife über die nächsten Datenpunkte, solange wie die Schwankungen
noch im erlaubten Rahmen sind. Wenn die Schwankungen zu groß sind, breche ab und mache beim nächsten Meßpunkt x1 weiter. usw.
t ist fest und unabhängig von n? Dann wäre es sogar nur O(n) - für n Messpunkte wird ein "Fenster" von t Punkten geprüft, also O(n*t), t ist konstant, bleibet O(n) :)

Und ließe sich auch recht Problemlos umsetzen, ohne Zugriff auf alle Daten auf einmal zu haben.
 

temi

Top Contributor
Fange beim ersten Meßpunkt x0 an. Dann mache eine Schleife über die nächsten Datenpunkte, solange wie die Schwankungen
noch im erlaubten Rahmen sind. Wenn die Schwankungen zu groß sind, breche ab und mache beim nächsten Meßpunkt x1 weiter.
Und ließe sich auch recht Problemlos umsetzen,

Hm, mein naiver Ansatz wäre:
  1. n = 0
  2. Nimm MPn und speichere ihn mit Zeitstempel in einer Queue (Q)
  3. Vergleiche MPn mit Q0 (Head), ob er innerhalb der gegebenen Toleranz liegt.
  4. Falls innerhalb der Toleranz, prüfe anhand des Zeitstempels den Zeitraum => Snippet gefunden?
  5. Falls außerhalb der Toleranz, entferne Q0 (Head).
  6. Ende der Messreihe erreicht? oder n++ und weiter bei 2
Die Queue kann erst mal im Arbeitsspeicher liegen, evtl. (abhängig vom Zeitraum) kann es notwendig werden, irgendwann in das Filesystem auszulagern. Sobald ein Snippet gefunden wurde, muss es natürlich auch mit den entsprechenden Zeitstempeln in einer Ergebnisliste gespeichert werden.

Könnte klappen, oder?

Edit: Noch mal nachgedacht. Passt nicht. :( Es müssen ja auch die anderen Datenpunkte in der Queue geprüft werden, bevor der aktuelle MP verworfen wird. Naja...
 

Christian S.

Mitglied
Hallo mrBrown:
ja, t ist fest (wird vom Anwender über die Gui eingegeben).
Und ja, für ein festes Fenster der Länge t ist die Komplexität O(n). Man muß einmal über das Fenster eine Schleife drüber laufen lassen und kann ggf. früher abbrechen.
Aber wenn wir Meßdaten haben, die länger sind als t, dann mußt du jedes beliebige Fenster auf den Gesamtdaten überprüfen. So bin ich auf den quatratischen Aufwand gekommen.
 

mrBrown

Super-Moderator
Mitarbeiter
Aber wenn wir Meßdaten haben, die länger sind als t, dann mußt du jedes beliebige Fenster auf den Gesamtdaten überprüfen. So bin ich auf den quatratischen Aufwand gekommen.
Wenn dir Fenster eine feste Größe haben, ist es trotzdem O(n).

Angenommen, es sind 100 Messpunkte und das Fenster hat Länge 10.
Des erste Fenster geht von Messpunkt 1 bis Messpunkt 10 mit „Aufwand“ 10. das nächste Fenster von MP 2 bis MP 11, wieder Aufwand 10, das nächste dann MP 3 bis MP 22, wieder 10.

Das ganze in dem Fall 90 (91-101 geht ja schon nicht mehr), oder grob N mal, mit jeweils Aufwand 10, oder allgemein t.
Macht insgesamt O(t*n), und da t konstant ist O(n).



Wenn man natürlich beliebig große Fenster hat und jede Fenstergröße (1s, 2s, ... 9h59m59s, 10h) testen will, landet man bei O(n*n) - dein Beispiel klang aber nicht danach.
 

mrBrown

Super-Moderator
Mitarbeiter
Edit: Noch mal nachgedacht. Passt nicht. :( Es müssen ja auch die anderen Datenpunkte in der Queue geprüft werden, bevor der aktuelle MP verworfen wird. Naja...
Ist dann aber nicht groß anders:

1. nächsten MP nem Puffer hinzufüge
(1.1. direkt nen passenden Puffer nehmen, der bei zu großem Zeitraum direkt das letzte Element rausschmeißt, Zeitraum ist daher nie zu groß)
2. prüfen, ob Puffer lang genug
2.1 wenn nein, weiter bei 1
3. über alle Elemente laufen und prüfen, ob gültig
3.1 wenn ja, gültige Sequence speichern
4. weiter bei 1, bis alle MP abgearbeitet


Schritt 1 muss man N mal machen, Schritt 3 ist Aufwand t. Optimieren kann man ein bisschen wenn, man 3. möglichst selten ausführt, zB indem man in 3. den Puffer kürzt auf die kürzeste mögliche Sequenz.
 

White_Fox

Top Contributor
Praktisch wird es sich nicht vermeiden lassen, die Daten in einer Datei zu halten und von dort auszulesen, zumindest wenn es sich um einen herkömmlichen PC handelt und es wirklich sehr viele Daten sind. Datenbanken legen ihre Daten ja auch i.d.R. im Filesystem ab.
Das ist richtig, hat aber mit dem Problem nichts zu tun das ich meine.
Es ist nicht dasselbe z.B. über Daten zu iterieren, die im Speicher oder auf der Festplatte liegen. Normalerweise werden die Daten z.B. von der Festplatte in den Arbeisspeicher (das Ding heißt nicht umsonst so) geladen, um damit zu arbeiten. Also um darüber zu iterieren, herumzueditieren, was "arbeiten" eben so bedeuten kann. Und wenn das Programm dann in einer Schleife 100 Datenzugriffe macht, finden eben 100 Lesezugriffe auf die Festplatte statt.

Etwas vereinfacht, heute haben ja auch CPUs mittlerweile noch weitaus schnellere Speichereinheiten, aber so in etwa sieht es dann aus. Soweit ich weiß, haben die Programme selber heute dank Speichervirtualisierung zumindest normalerweise keinen Einfluß mehr darauf, wo sie rumliegen.

Das war auf meinem alten Laptop übrigens eine Katastrophe mit dem virtuellen Speicher: 4GB (war damals, als der neu war, noch richtig viel), ein GB ging für die Grafikkarte drauf, ein GB brauchte Windows 7 schon für sich selber, Firefox und Altium Designer jeweils mehr als ein GB. Du konntest an der Speicherauslastung im Taskmanager exakt sehen ab wann alles schlagartig extrem langsam wurde (insbesondere Musik hören), wenn die Arbeitsspeicherauslastung bei 100% war.
 

juergenkulow

Mitglied
Hallo Christian S.
in 2 1/3 Monaten fangen die 20er Jahre an. Heute kann man 512 GB RAM in eine HP Z840 Workstation stecken und in Server noch mehr. Kannst Du versuchen an eine pratische Messung zu kommen.
Gruß
 

temi

Top Contributor
Hallo Christian S.
in 2 1/3 Monaten fangen die 20er Jahre an. Heute kann man 512 GB RAM in eine HP Z840 Workstation stecken und in Server noch mehr. Kannst Du versuchen an eine pratische Messung zu kommen.
Gruß

Hm, wenn man sich als Programmierer nicht um Resourcen scheren möchte, erhöht man also einfach die Hardwareanforderungen?
 

mihe7

Top Contributor
Hm, wenn man sich als Programmierer nicht um Resourcen scheren möchte, erhöht man also einfach die Hardwareanforderungen?
Im konkreten Fall lässt sich das ggf. mit dem Performancegewinn begründen, aber was Du beschreibst ist tatsächlich die Meinung nicht weniger Kollegen. Dabei habe ich das Gefühl, dass es vor allem jüngere sind, die diese "Lösung" präferieren.

Das Schlimme dabei ist: wegen betriebswirtschaftlicher Kurzsichtigkeit hast Du keine Chance dagegen - kannst Dir dafür den Finger in die Wunde legen, wenn der Mist dann zwei Monate später um die Ohren fliegt :)
 

temi

Top Contributor
Im konkreten Fall lässt sich das ggf. mit dem Performancegewinn begründen

Das ist möglich, ja, aber muss auch nicht unbedingt richtig sein. Es kann sein, dass es sich um eine zeitkritische Anwendung handelt, die dann auf einen dezidierten Rechner ausgeführt wird. Es kann genausogut sein, dass die Anwendung bei vielen Usern auf vielen unterschiedlichen PCs funktionieren soll, dann wäre es eher ungünstig.
 

juergenkulow

Mitglied
Hallo zusammen,

hier ein kleines Programmchen, was 25 simulierte double Messwerte pro ms erzeugt und auf eine Datei schreibt und das ganze über einen Tag. Wer kann mir in Java die Daten am Stück eingelesen, in den Speicher legen und einfach die Werte abfragen, JNI benutzen gilt nicht. Wo läge dann die maximale Anzahl der Messwerte?
Java:
// Erzeuge simulierte Messwerte mit 25 Messungen pro Sekunde
import java.io.*;
import java.nio.file.*;
class Messdaten {
    static final double PI= 3.14159265358979323846;
    public static double f(double d){
        return Math.sin(d*50.0*PI)*230.0;
    }
    public static void main(String[] args) {
        double sekunden=24.0*60.0*60.0; //86400 Sekunden am Tag //
        long   start = System.currentTimeMillis();
        double giblaut=0.0;
        
//        Path file = Paths.get("c:\\Users\\KulowCc2\\Documents\\Messung.mes"); // Dateiname an Umgebung anpassen.
        Path file = Paths.get("d:\\Messung.mes"); // Dateiname an Umgebung anpassen.
        try (DataOutputStream dos = new DataOutputStream(Files.newOutputStream(file))) {
            for (double d=0.0; d<sekunden ; d+=0.00004){
                // System.out.println(f(d));
                dos.writeDouble(f(d));
                if (d-giblaut>=10.0) {
                    System.out.println(d);
                    giblaut=d;
                }
            }
            System.out.println("Double-Werte wurden geschrieben.");
            System.out.println(System.currentTimeMillis()-start); // 92 ms für senkunden=1.0
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.exit(1);
        }
    }
}
/* für sekunden=60.0
10.000000000031642
20.000039999919515
30.000079999540937
40.00011999916236
50.00015999878378
Double-Werte wurden geschrieben.
2854
*/
Wer mit dem RAM in seinem 5k€ Rechner nichts anzufangen weiss, kann ja die Entwicklungsumgebung auf die Ramsdisk legen.
Viel Spaß.
 

temi

Top Contributor
Hallo zusammen,

hier ein kleines Programmchen, was 25 simulierte double Messwerte pro ms erzeugt und auf eine Datei schreibt und das ganze über einen Tag. Wer kann mir in Java die Daten am Stück eingelesen, in den Speicher legen und einfach die Werte abfragen, JNI benutzen gilt nicht. Wo läge dann die maximale Anzahl der Messwerte?

Wer mit dem RAM in seinem 5k€ Rechner nichts anzufangen weiss, kann ja die Entwicklungsumgebung auf die Ramsdisk legen.
Viel Spaß.

Was möchtest du uns damit sagen?

Oder versuchst du hier im Forum herauszufinden, wer, wieviel RAM in seinem Rechner hat?

PS: Ich habe keinen 5k€ Rechner...
 

juergenkulow

Mitglied
Hallo temi,
ich versuche, die Messdaten("Messung.mes") in Java weit unter einer Sekunde in den Speicher zu laden ohne JNI. und weis nicht wie das geht.
Wie viel Speicher steht Java im Heap zur Verfügung?
In anderen Programmiersprachen kann man Speicherbereiche die größer als der RAM allocieren, wie geht das in Java?
 

temi

Top Contributor
Hallo temi,
ich versuche, die Messdaten("Messung.mes") in Java weit unter einer Sekunde in den Speicher zu laden ohne JNI. und weis nicht wie das geht.
Wie viel Speicher steht Java im Heap zur Verfügung?
In anderen Programmiersprachen kann man Speicherbereiche die größer als der RAM allocieren, wie geht das in Java?

Ah, kaum sagt man was man will, schon versteht man es auch :cool:

Die Klasse Runtime hat zwei Methoden, die Infos zum verfügbaren Speicher geben. Allerdings habe ich noch nicht damit gearbeitet und kann nicht mehr dazu sagen:

https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#maxMemory()
 

mihe7

Top Contributor
// Erzeuge simulierte Messwerte mit 25 Messungen pro Sekunde
0.00004 sind aber 25.000 Messungen pro Sekunde, nicht 25.

Das macht pro Tag 86.400 Sekunden x 25 Werte/Sekunde x 8 Byte/Wert = 17.280.000 Bytes.

ich versuche, die Messdaten("Messung.mes") in Java weit unter einer Sekunde in den Speicher zu laden ohne JNI.
Ja, mit Memory Mapped Files, s. https://www.baeldung.com/java-mapped-byte-buffer
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sascha-sphw Auf GoPro Speicher zugreifen Allgemeine Java-Themen 10
TheJavaKid Mit Java die Festplatte mit dem meisten freien Speicher finden Allgemeine Java-Themen 7
J Strings int textdokumente speicher Allgemeine Java-Themen 3
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
L Input/Output Datei in den Speicher lesen. Allgemeine Java-Themen 9
Thallius Wie mache ich eine Java App mit Icon startbar die mehr Heap Speicher braucht? Allgemeine Java-Themen 3
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
M Speicher der VM Allgemeine Java-Themen 4
W PDFBox "Nicht genügend Speicher" Allgemeine Java-Themen 2
S Speicher-Problem Allgemeine Java-Themen 4
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
V Input/Output BufferedI/OStream leert den Speicher Allgemeine Java-Themen 7
G Speicher erhöhen Allgemeine Java-Themen 10
R Programm frisst 'Virtuellen Speicher' wie PacMan Allgemeine Java-Themen 4
P Java Anwendung mehr Speicher zur Verfügung stellen?? Allgemeine Java-Themen 3
A 2D-Grafik 2MB jpg wird zu 300MB im speicher (fehler) Allgemeine Java-Themen 8
E Speicherverwaltung bzw. Speicher wieder frei geben?! Allgemeine Java-Themen 8
D Speicher beim Start zuweisen Allgemeine Java-Themen 10
S Bei Sortierung Speicher zu gering? Allgemeine Java-Themen 8
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
S Jar Datei mit mehr Speicher starten Allgemeine Java-Themen 2
S JAR Datei, mehr Speicher bereitstellen Allgemeine Java-Themen 5
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
E Speicher frei machen (List) Allgemeine Java-Themen 9
J Speicher Probleme vorbeugen Allgemeine Java-Themen 8
C Laden / Speicher Allgemeine Java-Themen 8
R Eigener Assoziativ-Speicher Allgemeine Java-Themen 7
R Assoziativer Speicher welche Unterschiede? Allgemeine Java-Themen 5
S Zugesicherter Speicher der jvm nach Programmstart erhöhen Allgemeine Java-Themen 6
G FIFO Speicher nachbilden Allgemeine Java-Themen 2
G restlichen freien Speicher ermitteln? Allgemeine Java-Themen 3
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
J Wieviel Speicher maximal? Allgemeine Java-Themen 14
T Sortierter assoziativer Speicher mit Filter Allgemeine Java-Themen 4
L JVM: Speicher wieder für OS freigeben? Allgemeine Java-Themen 5
M Heap Speicher voll bei spezieller Resize Methode Allgemeine Java-Themen 5
R Gibt es eine JVM, die besser mit dem Speicher umgeht? Allgemeine Java-Themen 7
F OutOfMemoryError: Java heap space - Speicher verändern Allgemeine Java-Themen 8
O Datei im Speicher halten Allgemeine Java-Themen 4
C Speicher Problem Allgemeine Java-Themen 3
S TreeSet benötigt zu viel Speicher Allgemeine Java-Themen 5
J Out Of Memory - Speicher vergrößern? Allgemeine Java-Themen 2
L Nutzt Java bei Start der VM übermäßig viel Speicher? Allgemeine Java-Themen 3
F CPU auslastung wenn Speicher mit -Xmx erhöht Allgemeine Java-Themen 4
S Auslagerungsdatei (Speicher) werde voll Allgemeine Java-Themen 2
G Panel mit vielen Komponenten verbraucht viel Speicher Allgemeine Java-Themen 3
S Speicher Allgemeine Java-Themen 2
m@nu doppelte daten im speicher? Allgemeine Java-Themen 2
G Speicher Allgemeine Java-Themen 3
H wie viel speicher braucht eigentlich ein array? Allgemeine Java-Themen 2
A Speicher/Anzeige Problem in JTable Allgemeine Java-Themen 2
D Speicher der VM für ausführbares Jarfile erhöhen Allgemeine Java-Themen 4
D Eine geladene Klasse aus dem Speicher holen? Allgemeine Java-Themen 9
J in file schreiben frisst den speicher Allgemeine Java-Themen 5
P benötigter Speicher für Objekt Allgemeine Java-Themen 5
D Wieviel Speicher kann die VM verwalten? Allgemeine Java-Themen 18
C Über C/C++ (JNI) angeforderten Speicher wieder frei geben Allgemeine Java-Themen 3
H Speicher freigeben klappt nicht bei Image Objekten, warum? Allgemeine Java-Themen 8
B Kostet das speichern von Variablen zusätzlichen speicher? Allgemeine Java-Themen 2
T Speicher für die VM ändern Allgemeine Java-Themen 17
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
H Wie Cpu- und Speicher- Auslastung in Java auslesen Allgemeine Java-Themen 4
F Verfügbaren Heap-Speicher setzen Allgemeine Java-Themen 2
C RAM Speicher in Datei auslagern (Java Swapping) Allgemeine Java-Themen 4
N Speicher Problem bei grossem Heap Allgemeine Java-Themen 15
S Speicher reservieren Allgemeine Java-Themen 5
R nichtmehr benötigtes BufferedImages aus dem Speicher entfern Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben