Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#27

Re: 100 milliarden Werte speichern!

  Alt 1. Jul 2006, 11:22
Zitat von LePtitmort:
So jemand sagte das ich die Werte (bzw. jeden 10 000sten) in einer list speichern, wie ich schon sagte ich bin noch nicht ganz so Delhpi-fit. Was hat das für Vorteile?
In deinem Fall gar keine. Eine Liste ist einfach nur eine dynamische Datenstruktur, die Länge ist zu keinem Zeitpunkt festgelegt. Du kannst dir anschauen wie viele Elemente sich gerade in dieser Liste befinden, aber auch noch beliebig viele (soweit Speicher vorhanden) hinzufügen und wieder entfernen.

Zitat von LePtitmort:
ich brauch die alt berechneten Werte eigentlich nicht mehr, zumindest nicht regelmässig, ich brauch den letzetn Wert der Berechnung und des wars. Gibts noch andere bessere Metheoden?
Aber ja, denke ein paar wurden hier schon angesprochen. Wichtig ist es, das du nicht alles im Speicher hälst was du nicht brauchst. Dazu gleich mehr.

Zitat von LePtitmort:
Und mein Arbeitsspeicher kommt auch langsam an seine Grenzen... bleiben die Arrays im Arbeitsspeicher gespeichert?
Jede deiner Variablen landet im Arbeitsspeicher. Ein Array versucht sogar seinen kompletten Platz in einem Stück im Arbeitsspeicher zu finden. Ist dein Array nur groß genug, ist der Arbeitsspeicher sofort überfüllt (und es geht mit virtuellem Speicher weiter). Listen ändern daran auch wenig (aber hier nicht weiter wichtig).
Wenn du nur einen Wert (den letzten) benötigst, dann solltest du dir nur eine Variable anlegen und dort rein speichern. Damit sollten sich all deine Hauptspeicherprobleme lösen lassen.

Zitat von LePtitmort:
Und noch ein letzten Problem, meine extended Zahlen sind immer noch zu ungenau.... wie kann ich noich grössere Genauigkeit bekommen?
Mit einem normalen Prozessor wird das schwierig. Extended hat eine etrem hohe Genauigkeit für einen Computer. Für einen Rechner ist es nicht ganz so trivial Zahlen in einer hohen Genauigkeit zu speichern. Man hat einfach nur begrenzt viele Bits, die man für eine Zahl verwenden möchte. Da mit diesen Zahlen in extrem optimierten Einheiten (also jetzt Hardware) gerechnet wird, kannst du die Anzahl der Bits auch nicht beliebig für jede Zahl ändern. Es gibt zwei Möglichkeiten, Festkommazahlen (die Genauigkeit ist durch eine feste Anzahl von Nachkommastellen gegeben), was für hohe Genauigkeit einen extrem hohen Platzbedarf impliziert und Gleitkommazahlen. Diese berechnen sich auf eine etwas weniger intuitive Art und Weise. Ich möchte hier nicht auf das Rechnen mit Mantissen eingehen, aber wichtig ist, dass du nur eine ungefähre Genauigkeit hast. Gleitkommazahlen werden natürlich ebenfalls durch konst. viele Bits kodiert, aber die abgespeicherte Genauigkeit ist flexibel. Es gibt Zahlen (z.B. die 0) die lassen sich gar nicht direkt kodieren. Wenn man nun auch noch zwei solcher Zahlen Addiert, dann folgt auch dies sehr speziellen Regeln (durch die Art der Speicherung). Hierbei dominieren große Zahlen kleinere total. Ein Beispiel wäre es, dass du 1000 sehr sehr kleine Zahlen (<< 1) mit einer anderen Zahl (z.B. der 1) addieren möchtest.
Würdest du die Zahlen so addieren, dass du jede der 1000 Zahlen nach einander zur 1 hinzu addierst, wäre dein Ergebnis = 1, würdest du die Zahlen hingegen aufsteigend summieren (immer die beiden kleinsten, bis du die Summe über alle 1000 hast), dann wäre dein Ergebnis sehr viel genauer z.B. 1,0273.
Das Problem ist einfach, dass du dich bei der Gleitkommadarstellung auf die verwendeten Nach- und Vorkommastellen festlegen musst. Möchte wie gesagt nicht näher darauf eingehen, ist einfach so (findest du ganz schnell bei Google, wikipedia, ...)

Was das Speichern deiner Werte angeht, so solltest du sie tunlichst nicht im Speicher lassen. Wie du sie wohin bannst ist eigentlich egal. Es gibt ein Menge Möglichkeiten, die einfachsten und sinnvollsten wären Datenbanken oder Streams (Beides hier schon angesprochen). Wenn du einen FileStream verwendest, so werden die Daten direkt auf die Festplatte geschrieben. Natürlich mögen 900 GByte etwas sehr groß sein, aber es gibt natürlich auch für Delphi einfache zip-Komponenten, die dürften schon einiges kleiner kriegen. Du solltest allerdings auch hier Versuchen die einzelnen Dateien nicht zu groß zu machen. Insbesondere wenn du nicht regelmässig auf die Daten zugreifst, solltest du dir überlegen ob du die Werte nicht in viele (sinnvolle) kleine Portionen packen kannst (z.B. wären 10^6 Werte mit 10 Byte kodiert etwas unter 10 MByte groß, dass lässt sich dann sicher auch schnell entpacken und zur Verwendung auch mal kurz im Speicher halten ohne das es Probleme gibt).

Gruß Der Unwissende
  Mit Zitat antworten Zitat