Array dynamisch vergrößern
-
Ich hab folgendes Problem in Worten beschrieben:
Ich hole Messwerte von einem ad wandler über usb ab. Die Messung selbst ist Zeitgesteuert. Das heißt der User definiert, Messdauer 2 Sekunden. Da ich nicht weiß wieviele Messwerte in den 2 Sekunden anfallen, da das stark von der ausführ geschwindigkeit abhängt, kann ich nicht das array vorher festlegen.
Das heißt, solange wie die Zeitbedingung erfüllt ist muss in jedem Schleifendurchlauf dem array ein feld hinzugefügt werden.
Leider hab ich gar keine Ahnung wie ich das machen an kann.
Gibt es Erfahrungen darüber wie groß so ein Array werden kann? Wenn ich mal im Kopf überschlage können das durchaus mal 120000 Einträge werden.
Vielleicht hat auch jemand eine bessere Idee wie ich das generell handeln könnte. Weil ich so das Gefühl im Bauch habe, das ich schon besser Ideen hatte.
-
ich würde einen ausreichend grossen buffer fester länge nehmen, wenn dynamische arrays zu langsam sind oder so. aber das hängt davon ab, was mit den messwerten passieren soll, nachdem die gespeichert werden. bei 120000 bytes und nur 1 messwert alle zwei sekunden kannste schon einige stunden aufzeichnen. aber wahrscheinlich fehlt dir der speicher dafür oder?
-
Also spätestens wenn du den Maximalwert von size_t erreicht hast, ist Schluß mit der Speicheranforderung (das müsste etwa bei 65 kB oder 16000 int-Werte liegen). Dann solltest du dir ein anderes Konzept der Speicherverwaltung überlegen.
(wenn du die Daten nicht komplett auswerten willst, könntest du sie auch in eine Datei schreiben)
-
CStoll schrieb:
(das müsste etwa bei 65 kB oder 16000 int-Werte liegen)
Öhmmm, wie kommst jetzt darauf?
-
Also es enstehen ungefähr in 5 Sekunden 1000 Messwerte.
10 Minuten Messung bei maximaler Abtrastfrequenz ist so das ZielDie Werte direkt in eine Datei zu schreiben hab ich mir auch schon überlegt.
Dann hab ich allerdings das selbe Problem bei der graphischen Darstellung der Messwerte. Da müßte ich die Datei wieder komplett in den Speicher laden oder für jede Berechnung die Datei durchlaufen.
Kann ich mit malloc beliebig viel Speicher allocieren?
Die Mess-werte liegen im float format vor.
-
Beliebig sicher nicht. Aber deine 120000 Werte sollten als float ja so ungefähr 0.5 MB belegen. Auf einem normalen 32-System sicher keine absolute Hürde
-
TactX schrieb:
CStoll schrieb:
(das müsste etwa bei 65 kB oder 16000 int-Werte liegen)
Öhmmm, wie kommst jetzt darauf?
blind geraten
@Gh: Wenn möglich, kannst du die Daten auch häppchenweise einlesen und verarbeiten (und dir für die Skalierung des Diagramms merken, wieviele werte du hattest.
Kann ich mit malloc beliebig viel Speicher allocieren?
Wie gesagt: nur soviel, wie size_t an Werten hergibt.
-
Haltet es ihr für sinnvoll vom Gesamt Konzept her für in jedem Schleifendurchlauf das array mit realloc zu vergrößern?
Wie kann sich das auf die Performance auswirken?
Oder ist es besser die Werte in eine Datei zu schreiben wo sie sowie so hin müssen ohne zwischenspeichern, und dann für die Auswertung die Datei komplett einzulesen und das Array mit malloc zu definieren?Wie gesagt, ich habe damit nicht soviel Erfahrung mit solchen Datenmengen. Sry.
-
Gh_ent schrieb:
Haltet es ihr für sinnvoll vom Gesamt Konzept her für in jedem Schleifendurchlauf das array mit realloc zu vergrößern?
Nein, das definitiv nicht. Die allgemeine Strategie ist da normalerweise das Verdoppeln des Speichers wenn alter Speicher nichtmehr ausreicht.
-
Gh_ent schrieb:
Also es enstehen ungefähr in 5 Sekunden 1000 Messwerte.
10 Minuten Messung bei maximaler Abtrastfrequenz ist so das Zielach so, es sind doch ein paar mehr
ich hätte mal dein erstes posting besser lesen sollen...
Gh_ent schrieb:
Die Werte direkt in eine Datei zu schreiben hab ich mir auch schon überlegt.
kannste so machen...
Gh_ent schrieb:
Dann hab ich allerdings das selbe Problem bei der graphischen Darstellung der Messwerte. Da müßte ich die Datei wieder komplett in den Speicher laden oder für jede Berechnung die Datei durchlaufen.
benutzt du windoofs? da ist sowas kein problem (mit file mapping haste die daten in der datei und im speicher gleichzeitig).
-
Wie wärs denn mit ner eigenen Datenstruktur?
Zum Beispiel ne verkettete Liste. Jeder Listenknoten enthält Speicher für ämh vielleicht 1000 Messwerte. Wenn du merkst, das der Speicher knapp wird (Zähler einbauen), hängst du an die Liste nen neuen Knoten.
-
Super, Danke. Ich glaub, ich hab jetzt nen ganz guten überblick wie ich das generell lösen kann.
Ja...wird wohl auf einer windows kiste als webservice laufen. Kann mir unter file mapping gerade nix vorstellen, aber da befrage ich das große orakel.
Also vielen Dank.
-
GH_ENT schrieb:
aber da befrage ich das große orakel.
versuch's besser damit: http://windowssdk.msdn.microsoft.com/en-us/library/aa366556.aspx