Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich möchte ein ASCII-File auslesen. In jeder Zeile steht eine Information die ich brauche, deshalb werte ich jede Zeile aus, hole die Informationen aus der Zeile, die ich brauche und speichere diese in ein Array. Anfangs habe ich versucht das File komplett einzulesen. Dabei bekam ich Probleme mit dem Arbeitsspeicher, da die Files sehr groß sind. Darum lese ich die Files jetzt zeilenweise von vorne nach hinten aus. Das dauert aber viel zu lange. Deshalb möchte ich das Lesen aus der Datei parallelisieren. Das File soll nicht von vorne nach hinten ausgelesen werden, sondern es soll an mehreren Stellen im File gleichzeitig gelesen werden.
Ich lese deshalb beispielsweise parallel das erste, zweite und dritte drittel des Files, speichere die gewonnen Informationen in drei Arrays und führe diese drei Arrays zum Schluss zu einem Array zusammen. Davon erhoffe ich mir, dass das File dreimal so schnell ausgelesen werden kann.
Leider muss ich dafür das File dreimal öffnen und schließen. Im angehängtem Bild wird die Idee exemplarisch dargestellt. Die drei Sub-VIs lesen das jeweils File von der gegebenen Start-Adresse bis zur jeweiligen End-Adresse Zeile für Zeile aus, ziehen die gewünschten Informationen und speichern diese jeweils in 3 Arrays (Array 1, Array 2 und Array 3).
Dies funktioniert leider sehr unzuverlässig. Das File wird zum Schluss sehr langsam ausgelesen.
Gibt es eine bessere Methode ein File parallelisiert auszulesen, oder an verschiedenen Stellen im File gleichzeitig zuzugreifen? Gibt es vlt. VIs die für diese Zwecke geeignet sind?
Ich würde mich freuen, wenn Ihr mir helfen könnt.
10.08.2011, 15:07 (Dieser Beitrag wurde zuletzt bearbeitet: 10.08.2011 15:07 von SeBa.)
du willst ein Buch lesen. Einfach normal von vorne nach hinten lesen dauert dir zu lange. Also liest du es jetzt 'wannabe' parallelisiert aus. Dafür machst du folgendes:
Du öffnest das Buch an drei Stellen und liest gleichzeitig einen Satz von Stelle Eins, einen Satz von Stelle Zwei ... den zweiten Satz von Stelle Eins ect.pp. ich glaub soweit klar.
Falls du jetzt nicht gerade ein dreiköpfiger Hund bist, der in seiner Freizeit gerne schnell Bücher liest, sollte dir auffallen, dass das so nicht gehen kann. Du hast ja nur einen Kopf. Vedammt!
Buch = Datei
Du = Schreib-/LeseKopf der Festplatte
Hund = Raid-System
Gruß SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Hm, ja dass das nicht wirklich gleichzeitig abläuft ist mir klar. Wie das überhaupt geht, dass ich mehrmals eine Datei öffnen kann, weiß ich nicht. Ich weiß nicht was LabVIEW intern handhabt. Ich vermute ein C-Programm würde einen Laufzeit-Fehler liefern, wenn ich versuchte eine Datei mehrfach zu öffnen. Ich habe das VI schon getestet und es geben alle drei Sub-VIs Werte aus. Trotzdem löst das mein Problem nicht, da dies ja nicht zuverlässig funktioniert und mir ist ebenfalls klar, dass dies nicht sauber programmiert ist.
Meine Überlegung bei der Sache war, dass ich vermutet habe, dass das Lesen aus der Datei garnicht das ist, was am längsten dauert. Nur kommt ja noch die Verarbeitung jeder Zeile hinzu. Und das sollte nach Möglichkeit 3 mal gleichzeitig (also durch das Betriebssystem arbitriert) geschehen.
Mir kommen folgende Ideen:
Tripple Buffering -> Buffer 1 wird mit Werten von der Festplatte befüllt - Buffer 2 wird verarbeitet - Buffer 3 legt die Daten in einem Array ab
Nur ist mir noch nicht klar wie ich so etwas mit LabVIEW realisieren könnte.
Ich bin ursprünglich auch mal davon ausgegangen, daß das zeilenweise Lesen bei großen Dateien sehr viel länger dauert als das Einlesen in einem Block. Habe aber dann die Erfahrung gemacht, daß das fast gar nicht zutrifft. Man darf sich das zeilenweise Einlesen eben nicht so vorstellen, das da wegen jeder einzelnen Zeile ein Zugriff auf die Festplatte erfolgt. Das Lesen erfolgt vielmehr in größeren Blöcken, und die einzelne Zeile wird dann aus irgendeinem Zwischenpuffer gelesen (Gewöhnlich wird diese Aufgabe vom Puffer auf der HD besorgt, und vielleicht ist es bei Dir langsam, weil du eine Uralt-Festplatte ohne oder mit zu kleinem Puffer verwendest --> bitte mal den Typ benennen).
Deshalb schlage ich vor: Poste doch erst mal dein ursprüngliches VI. Da könnte man mal nachschauen, warum es langsam ist.