Speichermanagement von großen Datensätzen
- Aktualisiert2025-08-27
- 7 Minute(n) Lesezeit
LabVIEW nimmt die Speicherzuweisung automatisch vor. Da der Vorgang automatisiert ist, muss LabVIEW Vorkehrungen für die sichere Handhabung der Daten treffen. Das hat zur Folge, dass Daten häufig gespeichert werden. Wenn das Programm mit großen Datensätzen arbeitet, kann es aufgrund des häufigen Speicherns schnell zu Speicherplatzmangel kommen. Beachten Sie folgende Hinweise, um Probleme mit dem Arbeitsspeicher zu vermeiden und die Verarbeitung großer Datensätze zu optimieren.
Verringern der Anzahl von Kopien von großen Datenmengen
Da es sich bei LabVIEW um eine datenflussorientierten Programmiersprache handelt, wird eine Kopie erstellt, wenn ein VI mehr Daten benötigt, z. B. wenn sich eine Verbindung gabelt. LabVIEW kann in der Regel feststellen, wann eine neue Kopie erstellt werden muss. Ist dies jedoch nicht ganz eindeutig, wird vorsorglich trotzdem eine Kopie erstellt.
| Hinweis Beim Arbeiten mit dem LabVIEW Real-Time Module wird der Determinismus der Anwendung von Speicherkopien beeinflusst. |
Mit Hilfe des Fensters Pufferzuweisungen anzeigen können Sie festlegen, welchen Objekten LabVIEW Speicher zuweist. Mit diesem Fenster werden Datenpuffer identifiziert, in denen Datenkopien gespeichert werden.
Mit Hilfe der folgenden Regeln lässt sich die Anzahl der Kopien verringern:
| Hinweis Einige der nachfolgenden Hinweise widersprechen dem LabVIEW Style Guide und sollten nur bei der Arbeit mit umfangreichen Datensätzen zur Reduzierung der Speicherbelegung beachtet werden. |
- Verwenden Sie den kleinsten möglichen Datentyp. Verwenden Sie z. B. einen 16-Bit-Integer anstelle einer Fließkommazahl doppelter Genauigkeit.
- Verwenden Sie einfache Arrays. LabVIEW legt eine zusätzliche Kopie von Daten an, wenn ein Daten-Array für die Verarbeitung von Signalverläufen oder dynamischen Daten extrahiert wird.
- Erstellen Sie größere Blockdiagramme oder fügen Sie SubVIs inline ein, um Overhead zu reduzieren. Vermeiden Sie ein unnötiges Aufrufen von SubVIs, da dabei Datenkopien erstellt werden.
- Wenn Sie Daten durch SubVIs weiterleiten, stellen Sie sicher, dass alle Blockdiagrammanschlüsse außerhalb von Case-Strukturen oder Schleifen liegen. LabVIEW erzeugt mehr Kopien, wenn sich Anschlüsse in Case-Strukturen oder Schleifen befinden.
- Leiten Sie Daten nur durch Schleifen, wenn es sich nicht vermeiden lässt. Ist eine Schleife unumgänglich, verwenden Sie Schieberegister anstelle von Tunneln. Bei der Verwendung von Tunneln wird bei jedem Schleifendurchlauf eine Kopie erstellt.
- Verwenden Sie erforderliche Eingänge, sofern möglich. LabVIEW erstellt beim Erzeugen eines Standardwerts Kopien von Daten.
- Verwenden Sie Inplace-Elementstrukturen anstelle von flachen Sequenzstrukturen.
| Tipp In neueren LabVIEW-Versionen werden weniger automatisch erstellte Kopien angelegt als in älteren Versionen. Daher können neuere Versionen auch große Datensätze besser verarbeiten. |
Übertragung großer Datensätze
Wenn das Erstellen von Kopien nicht verhindert werden kann, sollten die Kopien möglichst klein gehalten werden. Teilen Sie dafür große Datensätze in kleinere auf, wenn Sie Daten übertragen. Beim Aufteilen in Datenpakete wirken sich die von LabVIEW erstellten Kopien nicht nachteilig auf den Speicherverbrauch aus. Die Kopien beeinträchtigen aber den Datendurchsatz, so dass nach wie vor eine möglichst geringe Anzahl empfohlen wird. Der Sachverhalt wird im folgenden Beispiel verdeutlicht.
Es liegt ein Datensatz von 512 MB vor, der auf einen Datenträger kopiert werden soll. Sie können alle Daten mit einem einzigen Aufruf erfassen und auf den Datenträger kopieren. Selbst wenn Sie die Anzahl der Kopien auf eins reduzieren, werden die ursprünglichen Daten und die Kopie davon übertragen. Es wird also 1 GB Speicher benötigt. Eine bessere Lösung ist die Aufteilung in Datenpakete von 500 KB und Übertragung dieser Pakete auf den Datenträger mithilfe von Disk-Streaming. So wird lediglich 1 MB Speicher benötigt (500 KB für die Originaldaten und 500 KB für die Kopie) und dies entspricht den zulässigen Werten der meisten Computer.
Als positiver Nebeneffekt wird die Zeit eingespart, die LabVIEW für die Zuweisung des umfangreichen Speicherblocks benötigen würde. Das Streaming von 250 MB auf einen Datenträger sollte nicht länger als 15 Sekunden dauern. Es ist möglich, dass LabVIEW allein für die Zuweisung der 1 GB Arbeitsspeicher beim Kopieren aller Daten so viel Zeit benötigt.
Beim Streaming von großen Datenmengen oder beim Speichern auf RAIDs (Redundant Arrays of Independent Disks - Redundante Anordnung unabhängiger Festplatten) können die Daten auch ohne Pufferung übertragen werden, um die Geschwindigkeit des Datentransfers zu erhöhen. Zum Deaktivieren der Pufferung verbinden Sie ein TRUE-Wert mit dem Eingang Pufferung deaktivieren der Funktion Öffnen/Erstellen/Ersetzen einer Datei.
Anzeige großer Datensätze
Bei vielen interaktiven Anwendungen wird lediglich die Anzeige der Daten für andere Benutzer benötigt. Es mag einen Grund für die Anzeige von fünf Millionen Datenpunkten geben, aber die meisten Bildschirme sind für eine solche Datenmenge nicht ausgelegt. Der durchschnittliche Graph in LabVIEW ist zwischen 300 und 1000 Pixel breit. Fünf Millionen Punkte sind das Dreifache der Daten, die in einem Signalverlaufsgraphen angezeigt werden können. In diesem Fall sollten die Daten dezimiert werden.
Angenommen, Sie möchten eine pixelgenaue Version des riesigen Datensatzes in einem Graphen anzeigen. Wenn es eine einzige Spitze in einem Puffer aus fünf Millionen Daten gibt, sollte der Plot eine horizontale Linie mit einem ein Pixel breiten Nadelpuls sein. Wenn die Daten eine Sinusschwingung mit mehr Perioden als die Pixelbreite des Bildschirms darstellen, sollte der Graph ein durchgehendes Band anzeigen - kein Aliasing. Ein Max.-Min.-Dezimierungsalgorithmus stellt in beiden Fällen die Lösung dar.
Bei der Max.-Min.-Dezimierung wird die Dezimierung mithilfe des kleinsten und größten Datenpunkts jedes Dezimierungsintervalls durchgeführt. Bei der einfachen Dezimierung wird der erste Wert jeden Intervalls verwendet. Die einfache Dezimierung führt zu Aliasing-Artefakten. Sie sollte nur verwendet werden, wenn die Zeit der ausschlaggebende Faktor und Genauigkeit nebensächlich ist.
Bestimmen Sie für die Durchführung der Max.-Min.-Dezimierung zunächst die Pixelbreite des Graphen. Nehmen Sie hierfür die Eigenschaft Plotbereich:Größe:Breite zu Hilfe. Zur Reduzierung der Artefakte benötigen Sie mindestens zwei Dezimierungsintervalle pro Pixelbreite. Multiplizieren Sie also die Pixelbreite des Graphen mit zwei, um die Anzahl der Intervalle zu bestimmen. Dividieren Sie die Datenlänge durch diesen Wert und runden Sie das Ergebnis auf die nächste ganze Zahl. Dieser Wert stellt die Datenpaketgröße für die Dezimierung dar. Bestimmen Sie für jedes Paket das Maximum und Minimum und ordnen Sie diese Werte so an, wie sie im Datensatz vorkommen. Die Tatsache, dass das letzte Paket weniger Werte als die anderen Pakete enthält, spielt hierbei keine Rolle. Dieser Teil ist kleiner als ein Pixel und wird somit nicht angezeigt. Verbinden Sie alle Maximum- und Minimumwerte und stellen Sie sie in einem Plot dar. Es werden vier Werte pro Pixelbreite auf dem Bildschirm angezeigt. So erscheint der einzelne ein Pixel große Nadelpuls, ohne benachbarte Pixel zu überdecken. Durch die Max.-Min.-Dezimierung wird dafür gesorgt, dass alle Datenspitzen angezeigt werden und Sie das durchgehende Band erhalten, das von der Sinusschwingung erzeugt werden sollte. All dies geschieht mit weniger angezeigten Daten und folglich sehr viel schneller.
In der folgenden Abbildung wird bei Verwendung der Max.-Min.-Dezimierung zur Datenverarbeitung der Graph auf der rechten Seite erzeugt.
Speichern großer Datensätze
Speichern Sie große Datensätze mit Hilfe einer Queue oder einer Datenwertreferenz, um den damit verbundenen Speicherverbrauch gering zu halten. Erstellen Sie eine Queue mit nur einem Element, das die Daten enthält. Um Zugriff auf die Daten zu erhalten, müssen Sie lediglich das Element aus der Queue entnehmen. Dadurch werden andere Bereiche im Programm am gleichzeitigen Zugriff auf die Daten gehindert. Wenn die Daten nicht mehr benötigt werden, fügen Sie das Element wieder der Queue hinzu. Sie müssen lediglich die Queue-Referenz weiterleiten. Beim Übertragen von Queues werden keine zusätzlichen Datenkopien erstellt. Wenn Sie der Queue einen Namen geben, können Sie an jeder beliebigen Stelle über die Funktion Queue anfordern eine Referenz auf die Queue anfordern. Das Erstellen mehrerer Datenobjekte ist genauso einfach wie das Erstellen mehrerer Queues.
Mithilfe einer Datenwertreferenz können Daten ebenfalls ohne Erstellen zusätzlicher Kopien gespeichert werden. Datenwertreferenzen sind etwas effizienter als Queues, sie haben aber keine Timeout-Optionen. Anstelle Daten an eine Queue zu übertragen, können Sie eine Referenz auf die Daten erstellen und dann mit dieser Referenz arbeiten. Verwenden Sie für die Arbeit mit den Daten eine Inplace-Elementstruktur. Der Rahmenknoten Datenwertreferenz lesen / schreiben akzeptiert Datenwertreferenzen als Eingang, ermöglicht die Verarbeitung der Daten innerhalb von Inplace-Elementstrukturen und ersetzt die Daten an ihrer ursprünglichen Stelle im Speicher.
| Hinweis Auf der Seite Vererbung des Dialogfelds Klasseneigenschaften kann die Erstellung von Datenwertreferenzen auf VIs der Klasse beschränkt werden. |
Sie können zum Speichern großer Datenmengen auch funktionale globale Variablen verwenden. Bei funktionalen globalen Variablen erfolgt das Speichern von und Zugreifen auf Daten in Paketen, wodurch Daten Speicherplatz sparend weitergeleitet werden können. Speichern Sie die Daten mithilfe nicht initialisierter Schieberegister. Verwenden Sie die Array-Funktionen, um die Daten zu lesen, schreiben und deren Größe anzupassen. Die Array-Funktionen erstellen keine Datenkopien. Dieser Ansatz ist in der Regel langsamer als die Verwendung von Queues.