28.11.2008, 09:44
|
IchSelbst
LVF-Guru
Beiträge: 3.700
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Datei-Parser optimieren
' schrieb:Wenn eg genug Speicher hat, würde ich die Datei vorher komplett auslesen und das Parsen (die Schlaufe) wird noch schneller ohne das Datei lesen.
Das ist ein guter Vorschlag: Umstellen von automatischem Filestream auf selbstgemachtes U8-Array-Auslesen: File in U8-Array einlesen. U8-Array über Index, der hochgezählt wird, auslesen. Dann steigt zwar die Komplexität des eigenen Sourcecodes, sollte aber um einiges schneller sein als Filestream.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
28.11.2008, 21:33
(Dieser Beitrag wurde zuletzt bearbeitet: 28.11.2008 21:33 von eg.)
|
|
|
29.11.2008, 12:56
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Datei-Parser optimieren
' schrieb:Das Prog habe ich im Nachfolgerthema gepostet:
Gut, dann werde ich mich mal dorthin auf die Socken machen..
|
|
|
07.12.2008, 11:57
|
|
|
07.12.2008, 19:26
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Datei-Parser optimieren
' schrieb:Schieberegister sind in LabVIEW seit mindestens Version 6 sowas von optimalisiert.
Danke für diese Information, genau so hatte ich das schon vermutet.
Ich staune auch, wie schnell die Funktion "Array umkehren" ist. Nach meiner Vorstellung müssen dort bei 1000 Elementen 500 Paare getauscht werden, und trotzdem ist es rasend schnell.
Gerade heute habe ich wieder etwas entdeckt: ein binäre File ganz einlesen kann man beschleunigen, wenn man nicht als Anzahl der Bytes "-1" (= alle) anschließt, sondern erst das VI für die Anzahl der Bytes aufruft, und dann diese Anzahl an das Read-VI anschließt.
Grüße Ludwig
|
|
|
07.12.2008, 21:11
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2008 21:12 von rolfk.)
|
rolfk
LVF-Guru
Beiträge: 2.306
Registriert seit: Jun 2007
alle seit 6.0
1992
EN
2901GG
Niederlande
|
Datei-Parser optimieren
' schrieb:Danke für diese Information, genau so hatte ich das schon vermutet.
Ich staune auch, wie schnell die Funktion "Array umkehren" ist. Nach meiner Vorstellung müssen dort bei 1000 Elementen 500 Paare getauscht werden, und trotzdem ist es rasend schnell.
Gerade heute habe ich wieder etwas entdeckt: ein binäre File ganz einlesen kann man beschleunigen, wenn man nicht als Anzahl der Bytes "-1" (= alle) anschließt, sondern erst das VI für die Anzahl der Bytes aufruft, und dann diese Anzahl an das Read-VI anschließt.
Grüße Ludwig
LabVIEW kennt intern etwas dass bei NI SubArray genannt wird. Dass ist ein spezieller Datentype der nur einen Pointer auf ein Array enthält sowie Informationen über die Anordnung der Daten darin. Bei 1D Arrays etwa sowas wie Stride (Interval), Length und Direction. Wenn Du also dann "Invers Array" machst wird eigentlich nur ein Subarray angelegt, diesem der Pointer auf das originale Array zugewiesen und das Direction Inversed Flag gesetzt. Alle Array Funktionen sind dann so schlau um bei Subarrays die Indexierung entsprechend anzupassen. Natürlich funktioniert das nur solange die Subarrays innerhalb von LabVIEW bleiben. Bei schreiben nach Disk, Flattenen oder beim übergeben des Arrays an eine DLL fällt das effektive kopieren halt trotzdem an.
Dasselbe passiert beispielsweise bei 2D Arrays wenn sie transposed werden. Subarray angelegt, pointer auf originales Array übergeben und trasnposed Flag gesetzt et voila, 500MB Daten in weniger als 1ms transposed .
Eine autoindexing Loop oder ein Arrayindex passt dann einfach die Indexberechnung an und funktioniert immer noch korrekt. Funktioniert beispielsweise gewaltig wenn man ein 2D Array transposen muss um in einer autoindex Loop die innere Dimension zu veränderen und danach wieder alles zurücktransposed. Effektiv wird nichts transposed sondern nur der autoindexing Loop ein anderes Indexing vorgegeben.
Rolf Kalbermatter
|
|
|
| |