Datei Bitweise einlesen - sehr langsam
Übersicht

![]() |
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![]() ![]() ![]() mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verwende zum einen Readbytes![]() ![]() 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 ![]() 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


Powered by phpBB © 2001 - 2006, phpBB Group