![]() |
100 milliarden Werte speichern!
Ich hab da nen Problem ich muss 100.000.000.000 Werte des typs extendend speichern (100 Milliarden also)
lol ich weiss sind ein paar viele...:) mein momentanes Array reicht leider nicht. Kann man Werte über 999.999 im Array nicht speichern? Gibts bessere Methoden zum speichern? (müssen nicht mal verfügbar sein, speichern reicht) Grüsse lepetitmort PS: ich wär über etwas "anfänger"-"slang" froh :) |
Re: 100 milliarden Werte speichern!
Die Werte kannst Du in einem File of ... speichern oder in einer entsprechend dimensionierten Datenbank.
|
Re: 100 milliarden Werte speichern!
Die Frage ist wohl eher: wovon musst du 1 Milliarde Werte speichern, und warum? Das ist eine Masse die....sich gewaschen hat :shock:
Greetz alcaeus |
Re: 100 milliarden Werte speichern!
hmmm, 100.000.000.000 Datensaetze zu 10Byte... gibt 1000000000000 Byte, ca. 976562500KB, = 953674 MB = ca. 931GB
Wo willste das Speichern? :zwinker: greetz Mike |
Re: 100 milliarden Werte speichern!
Zitat:
grz zer00 |
Re: 100 milliarden Werte speichern!
@ zer00
Das wären dann also 681196 Floppies Als Anfänger gehst Du aber ziemlich ran ... |
Re: 100 milliarden Werte speichern!
Zitat:
grz zer00 |
Re: 100 milliarden Werte speichern!
Zitat:
|
Re: 100 milliarden Werte speichern!
Ach, jetzt habe auch ich blindes Huhn noch den Postscriptum gesehen.
grz zer00 |
Re: 100 milliarden Werte speichern!
ohhh der Dimension war ich mir nicht bewusst. 900 Gb sind woll ein wenig viel. :)
na dann wird halt nur noch jeder 10.000ste wert gespeichert. wirds halt ein wenig ungenau aber das wird schon. Vielen Dank für die Hilfe! Problem vorerst aufgeschoben! |
Re: 100 milliarden Werte speichern!
Worum gehts eigentlich?
|
Re: 100 milliarden Werte speichern!
Wenn das nur zur Ermittlung einer Wahrscheinlichkeitskurve werden soll, dann kann man das auch anders angehen ;)
|
Re: 100 milliarden Werte speichern!
Wer speichert schon 100 Mrd. Daten? Man speichert doch nur die Bereiche, "in denen etwas los ist", schmeisst also die Messpunkte weg, die "uninteressant" sind. Uninteressante Messpunkte sind die Messpunkte, die sich mit einer -wie auch immer gearteten- Interpolation approximieren lassen. Das ist das alte Spiel der Datenkompression: JPEG zeigt, wie es so geht (Reduktion durch Interpolation).
Bei 2D-Daten kann man diverse Verfahren verwenden. |
Re: 100 milliarden Werte speichern!
Zitat:
Der wesentliche Anteil der Kompression nutzt eine Reduktion um hohe Werte im Frequenzraum von Bildteilen aus (da sie wenig zum Bildeindruck beitragen), um dadurch lange 0-Ketten zu erzielen. Diese werden RLE komprimiert, und zum Schluss noch ein Huffman drübergejagt. Zum Thema: Je nach dem wie die Daten aussehen, und ob du eine Zuordnung zu einer Skala (etwa das zeitliche Auftreten der Werte) machen kannst, wäre noch folgendes denkbar: Du speicherst nur wesentliche Veränderungen zu einem Vorgängerwert ab, und zusätzlich einen Zeitindex (oder was auch immer als Skala dienen kann) um (falls überhaupt nötig) eine skalentreue Rekonstruktion machen zu können. Das würde allerdings erst effizient werden, wenn zu erwarten ist, dass der Wert nicht schnell oder oft große Differenzen bildet, da ja eine Zusatzinformation her müsste. Vorteil bei dem Vorgehen könnte sein, dass relevante Stellen (oftmals ja bei größeren Wertänderungen) nicht verloren gingen. Da du uns aber bisher nicht sagen wolltest, was das für Werte sind, ist schlecht einzuschätzen ob das für dich toll ist ;) Gruss, Fabian |
Re: 100 milliarden Werte speichern!
Ähh nur ein ganz kurzer Hinweis: Man teilt bei JPEG das Bild in 8x8 Blöcke auf und führt anschließend eine diskrete Kosinustransformation durch. Diese ist noch gar nicht verlustbehaftet. Man erhält nur eine andere (kompaktere) Darstellung des Bildes - eine 8x8-Matrix, deren Einträge immer kleiner werten je weiter man nach rechts/unten gelangt. Anschließend führt man eine Quantisierung durch - das heißt die Matrix wird passend gerundet - sehr kleine Werte verschwinden. Dann komprimiert man die Matrix geeignet wodurch aber auch keine weitere Information verloren wird.
Bei der Dekodierung macht man das ganze rückwärts, muss aber nicht mehr "durch gleiche Werte" interpolieren - die Blöckchenbildung, die man anschließend erkennt, resultieren aus der Quantisierung die nach der Kosinustransformation stattgefunden hat. Man interpoliert höchstens, wenn man das Bild vergrößert/verkleinert/dreht. Dafür gibt es verschiedene Verfahren, die aber alle nichts mit JPEG zu tun haben. Generell kann man, wenn man ein Signal hat, prüfen, inwieweit man es glätten kann. Dafür gibt es viele Algorithmen - nicht nur den Mittelwert ;-) Man kann z.B. via Wavelet-Transformation hohe Frequenzen filtern, oder eine Fourier-Transformation durchführen und hohe Frequenzen löschen. Alternativ kann man natürlich Gaussische Filter anwenden, die einen gewichteten Mittelwert berechnen, etc. Der Glättungsalgorithmus der Wahl hängt allerdings stark von dem Signal hat und dem, was man an Details behalten will. Hat man zum Beispiel harte Kanten, bietet sich ein Mittelwertfilter nicht an, da die Kanten stark geglättet und damit weich gemacht werden... Zu all diesem sollte man jedoch ohne weiteres einiges an Literatur finden! |
Re: 100 milliarden Werte speichern!
Das war (mir zumindest - hab ja schonmal nen
![]() |
Re: 100 milliarden Werte speichern!
Naja mit ner anständigen SQL Datenbank wären auch mehrere GB Daten kein Problem. Ich seh das Problem eher beim Hauptspeicher falls die Daten alle zeitgleich im Client gebraucht werden.
|
Re: 100 milliarden Werte speichern!
Ich glaub, der meldet sich nicht mehr.
|
Re: 100 milliarden Werte speichern!
Nunja, eine DB wäre sicherlich am ehesten geeignet um auf den Daten zu operieren. Das eigentliche Problem ist denke ich ersteinmal >900GB Plattenplatz herzubekommen. Jedoch hatte der Fragesteller ja bereits eingeschränkt, dass er die Daten einfach nur hinschreiben muss, und nicht damit arbeiten. Daher wäre ein Filestream meiner Meinung nach ebenso geeignet. Die Frage ist halt nur: Werden alle Daten in voller Genauigkeit benötigt, bzw. gibt es ein mögliches gröberes Raster oder signifikante Sprünge die ausreichen? Weil 900GB sind in nicht-kommerzieller Umgebung nicht mal eben besorgbar (zumindest nicht am Stück).
Zudem ist noch die Frage: Wie schnell kommen die Daten herein? Die Platte müsste damit zumindest Schritt halten können :) |
Re: 100 milliarden Werte speichern!
Also ich schildere alles nochmal einwenig genauer:
Ich schreibe an einem Programm, dass die Planetenbahnen von n-Planeten anzeigen (also zeichnen und berechnen) soll. Ich berechne momentan 15 Millionen neue Positionen und nochmal so viele Geschwindigkeiten in 15 Sekunden. ![]() Achtung kann sein das die Leute mit ein wenig Arbeitsspeicher ihrem Pc ein jehes Ende setzen.... :-D (lieber die Schrittanzahl runtersetzen) Wir verwenden momentan noch ein Eulerverfahren und haben so vor den 9./10. Planeten unseres Sonnensystemszubeweisen. Dazu vergleichen wir berechnete Bahn mit der tatsächlichen. :?: 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? 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? :?: Und mein Arbeitsspeicher kommt auch langsam an seine Grenzen... bleiben die Arrays im Arbeitsspeicher gespeichert? :?: Ein weiteres Prob, das ich hab ist ein Scheibenwischereffekt der Auftritt wenn ich den Planeten mache, er "wischt" über meine Paintbox und löscht somit meine alten Bahnen (natürlich nur die Grafik nicht die berechneten Werte im Array). Und speichern und laden des bildes kommt auch nicht in Frage, auf Grund der grossen Schrittanzahl (monmentan wird jeder 200ste Schritt gezeichnet sh. im Programm unten rechts) :?: Und noch ein letzten Problem, meine extended Zahlen sind immer noch zu ungenau.... wie kann ich noich grössere Genauigkeit bekommen? :?: Mein Array ist momentan 10 x 10 x 999 999 gross (vom typ "extended") und wenn ich jetzt mein Array löschen will (bzw. genauer gesagt leeren oder überll ne 0 reinschreiben) dauert das ewig, gibts da nen Trick wie man das beschleunigen kann? irgendein schneller Befehl? weil mit ner for-Schleife einfach durchlaufen lassen dauerts eindeutig zulange. ich würde mich riesig über Tipps und kongrete Quelltext-ideen freuen. [weiterhin Vertreter des "Delphi-Anfänger-slangs"] [edit]: Das Programm kann nur einmal gestartet werden, weil des array nomentan nicht gelöscht wird, muss des programm einfach neu gestartet werden: -also "günstige werte" klicken, damit unser Sonnen system berechnet wird -dann "berechnen" -dann ankucken :) -dann schliesen -dann nochmal starten und wieder von vorne anfangen |
Re: 100 milliarden Werte speichern!
Zitat:
Delphi-Quellcode:
type
TArr = array[1..10,1..10,1..1000] of extended ; var Arr : TArr ; procedure LoescheArr (Arr : TArr) ; begin FillChar (Arr,sizeof(Arr),0) ; end; |
Re: 100 milliarden Werte speichern!
Gib bei diesem Programm mal bitte sinvollere Startparameter an, da ich nicht weiß wo ich Nullen lassen kann und wo nicht, bei mir kommt pro Sekunde 4 mal (oder auch öfter) ne DivByZero Meldung :?
Flare |
Re: 100 milliarden Werte speichern!
Zitat:
|
Re: 100 milliarden Werte speichern!
Das ist auf LePtitmort bezogen...
Flare |
Re: 100 milliarden Werte speichern!
einfach auf günstige werte klicken!
|
Re: 100 milliarden Werte speichern!
Geht klar :thumb: Nur wenn ich dann nochmal auf "Berechnen und zeichnen" klicke, macht er kompletten Blödsinn ^^
Normalerweise müsste er ja das selbe Bild nochmal zeichnen, das ist aber nicht annähernd so! Und diese DivByZero-Meldungen kamen bei mir nach dem 3. oder 4. mal "Berechnen ..." klicken wieder. Flare |
Re: 100 milliarden Werte speichern!
Zitat:
Zitat:
Zitat:
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:
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 |
Re: 100 milliarden Werte speichern!
Ein kleiner Denkanstoss: Wenn die Berechnung nicht sehr lange dauert, wäre zu überlegen, ob man nicht nur die Werte speichert, die man zur Berechnung braucht. Siehe dazu auch:
![]() |
Re: 100 milliarden Werte speichern!
@Jelly
In der Prozedur LoescheArr löschst du leider nur die lokale Kopie des Arrays. Besser so:
Delphi-Quellcode:
@LePtitmort
procedure LoescheArr (var Arr: TArr); // <-- VAR-Parameter!
begin FillChar (Arr, SizeOf(Arr), 0) ; end; Bei der Verwendung einer PaintBox solltest du nur innerhalb der Methode OnPaint zeichnen. Siehe dazu auch ![]() Gruß Hawkeye |
Re: 100 milliarden Werte speichern!
Wowow. super Tipps tolle Ideen bereits dabei.
|
Re: 100 milliarden Werte speichern!
Hallo,
gehe ich recht in der Annahme, dass die gespeicherten Werte 3D-Koordinaten sind? Wie wäre es dann, wenn Du nur die Vektoren speicherst? Dafür könntest Du Dir einen Record bilden. Es werden im Array die Records gespeichert. Diese enthalten den X/Y/Z Offset zur vorherigen Position im Koordinatensystem. Wenn Du den Maßstab und die Schrittweite geschickt wählst, könntest Du pro Wert dann sogar mit einem Byte auskommen(-128..127). Du brauchst dann nur noch den Startpunkt in "voller Auflösung" zu speichern. Beispiel:
Delphi-Quellcode:
type
TOffset = record XDiff, YDiff, ZDiff : shortint; end; |
Re: 100 milliarden Werte speichern!
Es sind zwar 3d-koordinaten die aber nicht primär zur Zeichnung genutzt werden sonder zur Berechung und daher eine sehr genau sei müssen aber danke... :thumb:
|
Re: 100 milliarden Werte speichern!
Zitat:
|
Re: 100 milliarden Werte speichern!
Das stimmt. Aber das sicher sagen zu können, müsste man entweder den verwendeten Algorithmus kennen oder eine represäntative Ergebnis-Zahlenreihe (nicht unbedingt eine mit 100 Mrd. Einträgen ;)). Oder man läßt sich während eines Programmlaufes die maximalen/minimalen Werte ermitteln und legt das Koordinatensystem darauf hin fest.
@LePtitMort: Welche Auflösung verwendest Du denn für die Berechnung? |
Re: 100 milliarden Werte speichern!
ich verwende extendedzahlen und selbst das ist zu ungenau... aber bis jetzt sagte mir jeder das eien ausweitung über extended sehr umständlich ist... deswegen bleib ich dabei.
|
Re: 100 milliarden Werte speichern!
Nein, ich meinte jetzt damit die dargestellte Maßeinheit (z.B. km, ly usw.)
|
Re: 100 milliarden Werte speichern!
Das Problem klingt richtig interessant. Könntest du vielleicht mal sagen, was du eigentlich machen willst und wie die Daten aussehen? Wahrscheinlich könnte man so den verwendeten Algo verbessern und käme auf eine einfachere Speichermethode.
|
Re: 100 milliarden Werte speichern!
Wie wäre es, wenn du - wie bei diversen Bildkompressionsverfahren - jeweils eine Differenz speicherst. U.U. sind dann die Zahlen nicht mehr so groß. Auch gäbe es sicher noch andere Methoden die Daten sinnvoll und dennoch effektiver zu speichern ohne gleich auf rechenzeitintensive Komressionsverfahren zu setzen.
|
Re: 100 milliarden Werte speichern!
@Toxmen: seite2 Mitte steht um was es geht. würde mich freuen wenn du Neuigkeiten hast
@Union : geschindigkeiten in m/s und Positionen in m, aber spielt auch keine Rolle, da die zahl 123456,7 gleich vielspiechern brauch wie die zahl 1,234567 @olli wäre ein Versuch wert das stimmt. |
Re: 100 milliarden Werte speichern!
Wenn du soviele Punkte nicht speichern willst, könntest du versuchen, sie als Funktionen darzustellen. Du könntest z.B. nach einer bestimmten Anzahl an Schritten die Bahn jedes Planeten als Polynom großen Grades zu approximieren, was nicht allzu schwierig sein sollte, oder als Fourierentwicklung. Je nach dem wie die Bahnen aussehen, könnte es vor der approximation sinnvoll sein, in Kugelkoordinaten zu wechseln. Dann hättest du in jeder Komponente Funktionen, die sich gut durch Sinus-terme beschreiben lassen sollten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz