Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Michael1234
Anmeldungsdatum: 21.07.2008 Beiträge: 16
|
Verfasst am: 02.08.2009, 18:27 Titel: Handling von großen Datenvektoren |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 02.08.2009, 20:17 Titel: |
|
|
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
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 |
|
 |
Michael1234
Anmeldungsdatum: 21.07.2008 Beiträge: 16
|
Verfasst am: 02.08.2009, 20:45 Titel: |
|
|
Vielen Dank, Sebastian
Die Werte die es zu bearbeiten gilt, enthalten auch Kommazahlen. Funktioniert dies auch im Binärsystem?
Viele Grüße |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.08.2009, 20:56 Titel: |
|
|
der computer verarbeitet ALLES im binärsystem  _________________ "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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.08.2009, 22:22 Titel: |
|
|
MisterD hat Folgendes geschrieben: | der computer verarbeitet ALLES im binärsystem  |
Nein, Computer rechnen im Hexadezimalsystem, bzw intern bitweise. Quelle: http://kryptochef.de/
 _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Michael1234
Anmeldungsdatum: 21.07.2008 Beiträge: 16
|
Verfasst am: 03.08.2009, 19:43 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 03.08.2009, 21:05 Titel: |
|
|
kannst du bei ner datei im binärmodus genauso, lies mal die referenz zu GET  _________________ "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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 03.08.2009, 22:10 Titel: |
|
|
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 |
|
 |
Michael1234
Anmeldungsdatum: 21.07.2008 Beiträge: 16
|
Verfasst am: 03.08.2009, 22:50 Titel: |
|
|
das geht ja wirklich beindruckend schnell! ich werd mal probieren dass in mein programm zu integrieren!
Danke! |
|
Nach oben |
|
 |
Michael1234
Anmeldungsdatum: 21.07.2008 Beiträge: 16
|
Verfasst am: 03.08.2009, 23:27 Titel: |
|
|
Fazit: von ca. 30 sek pro Datei auf insgesamt ca. 3 sek!
Hammer!
Vielen Dank!!!! |
|
Nach oben |
|
 |
|