Virtueller Speicher

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.
 
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.
 
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...
 
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.
 
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.
 
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.
 
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.
 
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ß
 
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?
 
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 :)
 
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.
 
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ß.
 
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...
 
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?
 
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()
 
// 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
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben