Datei Bitweise einlesen - sehr langsam
Übersicht
BlitzBasic
Allgemein|
|
TrustBetreff: Datei Bitweise einlesen - sehr langsam |
Antworten mit Zitat |
|---|---|---|
|
Hallo,
ich habe folgende Funktion zu Testzwecken geschrieben die mir eine Datei Bitweise einlesen soll, nur leider ist diese extrem langsam. Dies liegt sicher an den BB Funktionen "Bin$" und "Readbyte"... Gibt es da bessere bzw. schnellere alternativen? Die Funktion: Code: [AUSKLAPPEN] Function ReadFileToBits$(inData$)
Local file = ReadFile(inData$) Local bitString$ While Not Eof(file) bitString$ = bitString$ + Right$(Bin$(ReadByte(file)), 8) Wend CloseFile file Return bitString$ End Function |
||
| Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. | ||
|
|
Eingeproggt |
Antworten mit Zitat |
|---|---|---|
Eine geringe Verbesserung könnte man dadurch erzielen, indem man ReadInt statt ReadByte verwendet, denn dann kann man sich Right sparen. Wie das aussieht wenn die Dateigröße nicht genau durch 4 teilbar ist weiß ich grad nicht, aber damit lässt sich wunderbar überleiten zu weiterer Optimierung: Wo man nämlich wissen müsste, was du genau erreichen möchtest? Was für Dateien sind es? Wozu brauchst du die Binärdarstellung? etc?
mfG, Christoph. |
||
| Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 | ||
|
|
BladeRunnerModerator |
Antworten mit Zitat |
|---|---|---|
Verwende zum einen Readbytes statt ReadByte , denn der Byteweise Zugriff bremst dein System enorm.
Zum anderen: ist es wirklich notwendig die gesamte Datei komplett als Einzelbitstream zu haben. Die Strings fressen ja enormst Platz. Das scheint mir sehr ineffizient. |
||
|
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
||
|
|
Eingeproggt |
Antworten mit Zitat |
|---|---|---|
|
Habs mir genauer angesehen, das Problem ist überhaupt das Hantieren mit Strings bei größeren Dateien. Wenn bei jedem Byte einer sagen wir 50kb großen Datei der String im Speicher herum kopiert werden muss, sind das am Ende 50.000 Zeichen die sinnlos herum geschoben werden.
Mein Ansatz: BlitzBasic: [AUSKLAPPEN] Dim bits(0) Achtung, Erklärungen: 1.) Der Ansatz ist wesentlich schneller. Bei einer 51kb großen Testdatei hat deine Funktion ~2sek gebraucht - meine 30ms. 2.) Dafür ist es unschön, dass das Ergebnis in einer globalen Variable / einem Array steckt... geht mit Blitz fürchte ich nicht besser. Dafür kann man bequem darauf zugreifen. 3.) Das Ausgeben der Bits in meinem Ansatz ist extrem lahm und schon bei 1kb Dateien kaum erträglich... Das liegt aber nicht an mir sondern am Debuglog - ich finde das Speichern im Array hat nur Vorteile. Der nach meienm Verständnis 4mal so hoch geschätzte (Im Array sind Ints, im String sind Bytes) RAM-Verbrauch sollte das Wet sein.
mfG, Christoph. |
||
| Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 | ||
|
|
Trust |
Antworten mit Zitat |
|---|---|---|
|
Die Binärdarstellung wird benötigt, um die Datei später mit einer Funktion zu komprimieren, welche ich noch nicht geschrieben habe.
Ich möchte Mediadateien - hauptsächlich Bilder, schnell komprimieren, bzw. eine speicherarme Textdarstellung aus diesen Dateien erstellen. Um diese Textdarstellung dann einfach per copy&paste ins Programm kopieren zu können, welche mir dann wieder diese Datei daraus erstellt. @BladeRunner Muss ich für Readbytes aber dann nicht vorher schon die genaue Anzahl an Bytes wissen die ich einlesen will? |
||
| Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. | ||
- Zuletzt bearbeitet von Trust am So, Apr 22, 2012 0:12, insgesamt 2-mal bearbeitet
|
|
BladeRunnerModerator |
Antworten mit Zitat |
|---|---|---|
| Du kannst ja Blockweise einlesen, sagen wir Kilobyteweise. Wenn nicht genug eingelesen werden kann gibt dir Readbytes dass ja zurück. | ||
|
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
||
|
|
Trust |
Antworten mit Zitat |
|---|---|---|
|
Ok habe nun alle Vorschläge ausführlich getestet und bin zu dem Entschluss gekommen, dass es sinnvoller ist, die Datei Byteweise in eine Bank einzulesen und ggf. im nachhinein die Bankeinträge in 8bit streams umzuwandeln.
Der Geschwindigkeitsvorteil im Gegensatz zum Bitweise einlesen ist enorm. Das Bitweise einlesen braucht bei einer ca 1.8 MB grossen Datei ca. 2319 ms, und diese dann wieder Bitweise zu schreiben, dauert ca. 11098 ms! Im gegenzug dauert das Byteweise einlesen der 1.8 mb grossen Datei 1 ms, und schreiben 34 ms. Für die wo es interessiert hier die Funktionen: Bitweise einlesen und schreiben: BlitzBasic: [AUSKLAPPEN] Dim BitFunctions_Bit(0) ; Muss im Hauptprogramm angelegt werden Hier die Functionen zum Byteweise einlesen und schreiben: BlitzBasic: [AUSKLAPPEN] Global BitFunctions_Bank ; Im Hauptprogramm anlegen Die Bank könnte man auch Lokal anlegen und als Parameter an die Funktion WriteFileToBytes() übergeben. Und wer Strings in Bits umwandeln möchte und umgekehrt: BlitzBasic: [AUSKLAPPEN] Function StringToBits$(inString$) Danke an alle für die Hilfe! |
||
| Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. | ||
Übersicht
BlitzBasic
Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group

