Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Handling von großen Datenvektoren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Michael1234



Anmeldungsdatum: 21.07.2008
Beiträge: 16

BeitragVerfasst am: 02.08.2009, 18:27    Titel: Handling von großen Datenvektoren Antworten mit Zitat

Hallo zusammen,

ich habe ein Programm, welches auf große Datenmengen zurückgreifen muss. Diese Daten habe ich in Form von txt-Dateien hinterlegt. Es handelt sich um mehrere Dateien mit jeweils mehreren Hunderttausend Werten.

Bisher hatte ich mein Programm so gestaltet, dass ich die txt mit OPEN öffne und die Werte mit INPUT in variablen übertrage. Das ganze läuft über eine FOR Schleife.

Funktioniert soweit auch ganz gut, dauert aber sehr lange!


Meine Frage: Kann ich das irgendwie anders lösen?

Kann ich die Werte irgendwie DIREKT in den Programmcode einbinden, ohne diese erst auslesen zumüssen?

Am besten wäre eine Art Datenvektor/array wo ich direkt auf einen bestimmten wert zurückgreifen kann!


Vielen Dank für Eure Mühen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 02.08.2009, 20:17    Titel: Antworten mit Zitat

Hallo,

prinzipiell lassen sich u. a. mit DATA Nutzdaten direkt im Programm unterbringen, aber ob das bei
Zitat:
mehreren Hunderttausend Werten

noch sinnvoll ist, würde ich mal bezweifeln. Die Dateilösung ist da vermutlich am besten geeignet. Du könntest aber vielleicht Geschwindigkeitsoptimierungen vornehmen, indem du Binärdateien (BINARY) statt sequenzieller Plain-Text-Dateien (INPUT) verwendest.

Beispiel zum Abspeichern von Daten in Binärform:
Code:
DIM AS INTEGER Zahl, i
RANDOMIZE TIMER
OPEN "TEST.DAT" FOR BINARY AS #1
FOR i = 1 TO 100000
  Zahl = INT(RND*10000)+1
  PUT #1, , Zahl
NEXT i
CLOSE #1
PRINT "100.000 Zufallszahlen erzeugt und als Datensaetze geschrieben."
SLEEP: END

...und Auslesen:
Code:
DIM AS INTEGER Zahl
OPEN "TEST.DAT" FOR BINARY AS #1
DO UNTIL EOF(1)
  GET #1,,Zahl
  'Zahl könnte jetzt weiterverarbeitet werden
LOOP
CLOSE #1

Diese Form der Datenspeicherung hat den Vorteil, dass die Daten so abgespeichert werden, wie sie FreeBASIC auch "intern" verarbeitet.

Wenn man die Zahlen als Klartext speichert
Code:
123
556
456
...

und mit INPUT einliest, muss intern zunächst anhand von Stringmanipulationsfunktionen ermittelt werden, wo die Zahl anfängt und aufhört (Zeilenumbruch suchen). Anschließend muss die Zeichenkette isoliert und in einen Wert des jeweiligen Datentyps überführt werden.

Bei den Binärdateien entfallen Umwandlungen jeder Art. Die Daten gelangen aus der Datei direkt in die Variablenspeicherstelle. Alle Datensätze in der Datei haben die gleiche Länge in Bytes, im Beispiel die Länge eines Integers (=4 Byte), egal, ob der gespeicherte Zahlwert 1 oder 4.103.454 beträgt. Der Nachteil dieser Methode besteht darin, dass sich die Daten in der Datei nicht als Klartext z.B. in Notepad lesen lassen.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael1234



Anmeldungsdatum: 21.07.2008
Beiträge: 16

BeitragVerfasst am: 02.08.2009, 20:45    Titel: Antworten mit Zitat

Vielen Dank, Sebastian


Die Werte die es zu bearbeiten gilt, enthalten auch Kommazahlen. Funktioniert dies auch im Binärsystem?

Viele Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.08.2009, 20:56    Titel: Antworten mit Zitat

der computer verarbeitet ALLES im binärsystem zwinkern
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 02.08.2009, 21:18    Titel: Antworten mit Zitat

Zitat:
Die Werte die es zu bearbeiten gilt, enthalten auch Kommazahlen. Funktioniert dies auch im Binärsystem?

Mit Datentypen für Gleitkommazahlen (SINGLE und DOUBLE) funktioniert das genauso wie mit Ganzzahlen (INTEGER). Ob SINGLE oder DOUBLE die richtige Wahl ist, hängt davon ab, welche Genauigkeit an Stellen benötigt wird.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.08.2009, 22:22    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:
der computer verarbeitet ALLES im binärsystem zwinkern

Nein, Computer rechnen im Hexadezimalsystem, bzw intern bitweise. Quelle: http://kryptochef.de/


durchgeknallt durchgeknallt durchgeknallt
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael1234



Anmeldungsdatum: 21.07.2008
Beiträge: 16

BeitragVerfasst am: 03.08.2009, 19:43    Titel: Antworten mit Zitat

Also ich hab's mal ausprobiert und es geht tatsächlich etwas schneller: 25 sec anstelle von 30 sec (pro datei)

aber gibtes vielleicht auch die möglichkeit die daten direkt zu nutzen? also ohne, dass ich sie erst wert für wert in eine variable schreiben muss?

geht dass vlt. mit data? so dass ich einen datenvektor anlegen und direkt auf die enthalten werte zurückgreifen kann (z.B. wert 283139) aber nicht erst wert 1-400000 einlesen muss?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 03.08.2009, 21:05    Titel: Antworten mit Zitat

kannst du bei ner datei im binärmodus genauso, lies mal die referenz zu GET zwinkern
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 03.08.2009, 22:10    Titel: Antworten mit Zitat

Du kannst die Datei ja einfach direkt in ein Array einlesen:
Code:
#define mehrere 40 *
const Hunderttausend as Integer = 100000

Dim shared bigArray(1 to mehrere Hunderttausend) as Integer

Dim q as Integer
Dim w as Integer
Dim FF as Integer
Dim TempDaten as String
Dim StartZeit as Double
Dim EndZeit as Double


'PSEUDO-Daten generieren
print "Pseudodaten-Datei generieren...";
StartZeit = Timer
if dir("BigData.dat") <> "" then kill "BigData.dat"
FF = Freefile
open "BigData.dat" for binary as #FF

for q = 1 to mehrere Hunderttausend
   TempDaten = ""
   for w = 1 to sizeof(INTEGER)
      TempDaten += chr(rnd()*255)
   Next
   put #FF,,TempDaten
Next

close #FF
EndZeit = Timer
print using "Fertig (##.### Sekunden verstrichen)."; (EndZeit-StartZeit)



'Werte in Array einlesen
print "Werte einlesen...";
StartZeit = Timer
if dir("BigData.dat") = "" then print "Datei fehlt!": end
FF = Freefile
open "BigData.dat" for binary as #FF

get #FF,,bigArray(1), mehrere Hunderttausend

close #FF
EndZeit = Timer
print using "Fertig (##.### Sekunden verstrichen)."; (EndZeit-StartZeit)



sleep

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael1234



Anmeldungsdatum: 21.07.2008
Beiträge: 16

BeitragVerfasst am: 03.08.2009, 22:50    Titel: Antworten mit Zitat

das geht ja wirklich beindruckend schnell! ich werd mal probieren dass in mein programm zu integrieren!


Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael1234



Anmeldungsdatum: 21.07.2008
Beiträge: 16

BeitragVerfasst am: 03.08.2009, 23:27    Titel: Antworten mit Zitat

Fazit: von ca. 30 sek pro Datei auf insgesamt ca. 3 sek!

Hammer!


Vielen Dank!!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz