Echtzeit Datenverarbeitung
-
Ich habe eine Frage bezüglich der Datenverarbeitung, eigentlich ist es eher das erfragen um einen Ratschlag.
Ich erhalte alle 10 [ms] neue Daten, die ich gerne verarbeiten und in einem Vektor abspeichern möchte, bevor neue Daten kommen die wiederrum in denselben Vektor gehen.
Die Erfahrung die ich dabei gesammelt habe ist, dass dynamische Speicher allokierung wie mit .push_back oder .insert mehre [ms] dauert. Daher arbeite ich im Moment so, dass ich für zwei Vektoren Speicherplatz reserviere. Die Daten werden dabei in den ersten Vektor geschrieben und verarbeitet bis dieser voll ist, danach werden die Daten in den anderen Vektor geschrieben. Während das passiert kopiert ein thread die Daten aus dem ersten Vektor in eine Text Datei. (so dass ich später drauf zugreifen kann.)
Ich habe gemerkt das, dass rausschreiben von Daten in eine Textdatei schneller geht als mit push_back.
Was sagt ihr? Mache ich das soweit richtig oder habe ich etwas übersehen?
Grüße
-
push_back und insert lassen darauf schliessen, dass es um ISO C++ geht und nicht wie in diesem Unterforum um C++/CLI (eine .NET Sprache).
Kommt mir alles ein wenig komisch vor - und vermute Flaschenhälse an anderen Orten als push_back. Beispielcode und Messungen helfen dir aber sicher die richtige Strategie zu wählen. Vielleicht rührt deine Aussage "Ich habe gemerkt das, dass rausschreiben von Daten in eine Textdatei schneller geht als mit push_back." daher, dass beim Schreiben in eine Datei auch wieder gepuffert wird?
-
pushback arbeitet nur "effizient", wenn er nicht "resized" also erweitert werden muss. Wobei der vector intern mehr speicher allokieren kann als er unbedingt braucht.
Der Nachteil des vectors ist halt seine Kompatiblität zum Array, was eigentlich seine Daseinsberechtigung ist. d.h. er muss alle daten hintereinander im speicher Alligned haben. Geht man über seine (reservierte) Größe heinaus, muss er neuen Speicher vom OS holen (langsam) und alle bisherigen rüberkopieren.
Du hasst 2 Möglichkeiten:
1. mehr Speicher im vorraus anfordern und damit versuchen das resizen zu vermeiden (reserve ist die funktion am vector dafuer).2. Container verwenden die Ihre daten nicht im Speicher alligned halten dürfen. Die list (double linked lis) ist der container, der beim anfügen und löschen am wenigsten problematisch ist.
Ciao ...