# Virtueller Speicher



## Christian S. (16. Okt 2019)

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 (16. Okt 2019)

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. (16. Okt 2019)

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 (16. Okt 2019)

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.


----------



## M.L. (16. Okt 2019)

Das könnte auch helfen: https://www.baeldung.com/java-read-lines-large-file


----------



## temi (16. Okt 2019)

Christian S. hat gesagt.:


> 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.


----------



## Christian S. (16. Okt 2019)

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


----------



## Christian S. (16. Okt 2019)

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 (16. Okt 2019)

Christian S. hat gesagt.:


> 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,
> ...





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 .


----------



## mihe7 (16. Okt 2019)

Das scheint mir das ideale Gebiet für simple Key-Value-Stores zu sein, z. B. https://github.com/OpenHFT/Chronicle-Map


----------



## mrBrown (16. Okt 2019)

Christian S. hat gesagt.:


> 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?


----------



## mrBrown (16. Okt 2019)

mihe7 hat gesagt.:


> Das scheint mir das ideale Gebiet für simple Key-Value-Stores zu sein, z. B. https://github.com/OpenHFT/Chronicle-Map


Oder sowas wie InfluxDB, je nach Daten


----------



## Christian S. (16. Okt 2019)

Danke an alle Beiträge. Ich denke damit kann ich was anfangen. Wenn ihr noch mehr Anregungen habt, dann natürlich gerne her damit


----------



## temi (16. Okt 2019)

mrBrown hat gesagt.:


> 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.


----------



## Xyz1 (16. Okt 2019)

@Christian S. Du suchst also nach einer Lib welche einen beliebig wachsenden Buffer auf die Disk auslagert.








						Is there a Java library the can cache data in memory or disk depending on the size of the data?
					

Is the a way to write something to a buffer, but once the buffer gets to large, start writing to a file?  I would like this whole process to be automatic.  Basically, I would like to write to a buf...




					stackoverflow.com
				



Suche mal nach z. B. Heritix.


----------



## mrBrown (16. Okt 2019)

temi hat gesagt.:


> 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 (16. Okt 2019)

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 (16. Okt 2019)

White_Fox hat gesagt.:


> 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.


----------



## Xyz1 (16. Okt 2019)

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


----------



## thecain (16. Okt 2019)

Performance liegt ja auch im Auge des Betrachters, bzw der Anforderungen. Man braucht nirgends zu optimieren wo es nicht nötig ist


----------



## Christian S. (17. Okt 2019)

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 (17. Okt 2019)

Christian S. hat gesagt.:


> 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 (17. Okt 2019)

Christian S. hat gesagt.:


> 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.





mrBrown hat gesagt.:


> Und ließe sich auch recht Problemlos umsetzen,



Hm, mein naiver Ansatz wäre:

n = 0
Nimm MPn und speichere ihn mit Zeitstempel in einer Queue (Q)
Vergleiche MPn mit Q0 (Head), ob er innerhalb der gegebenen Toleranz liegt.
Falls innerhalb der Toleranz, prüfe anhand des Zeitstempels den Zeitraum => Snippet gefunden?
Falls außerhalb der Toleranz, entferne Q0 (Head).
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. (17. Okt 2019)

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 (17. Okt 2019)

Christian S. hat gesagt.:


> 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 (17. Okt 2019)

temi hat gesagt.:


> 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 (17. Okt 2019)

temi hat gesagt.:


> 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 (22. Okt 2019)

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 (24. Okt 2019)

juergenkulow hat gesagt.:


> 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 (24. Okt 2019)

temi hat gesagt.:


> 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 (25. Okt 2019)

mihe7 hat gesagt.:


> 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.


----------



## mihe7 (25. Okt 2019)

Systemanforderungen: min 1 GB, empfohlen 512 GB freier Arbeitsspeicher


----------



## juergenkulow (27. Okt 2019)

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?

```
// 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 (27. Okt 2019)

juergenkulow hat gesagt.:


> 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?
> 
> ...



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 (27. Okt 2019)

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 (27. Okt 2019)

juergenkulow hat gesagt.:


> 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 

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 (27. Okt 2019)

juergenkulow hat gesagt.:


> // 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.



juergenkulow hat gesagt.:


> 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


----------

