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:

Geschwindigkeit erhöhen beim Load-Befehl?

 
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 01.10.2017, 02:00    Titel: Geschwindigkeit erhöhen beim Load-Befehl? Antworten mit Zitat

Mir dauert das Laden von Werten aus einer Datei etwas zu lange!!! Gibt es eine Möglichkeit, dass das laden nicht zu lange dauert?

Beispiel:

Code:
OPEN "C:\Test.txt" FOR INPUT AS #f
   j = 1
   DO UNTIL EOF(f)
     INPUT #f, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
     IF MULTIKEY(&h01) THEN EXIT DO
     j += 1
  LOOP
CLOSE #f


Wenn ich da jetzt über 100.000 Zeilen in einer Datei drin habe, dauert das extrem lange. Bei meinem Testrechner ist das unter 1 Minute. Aber das ist auf dem schnellen Rechner den ich habe, noch in Ordnung! Bei den anderen dauert das einfach zu lange. Ideal wären 5-10 Sekunden fürs einlesen.

Vielleicht hat da einer eine Idee?
Was ist mit Assembler?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.10.2017, 08:24    Titel: Antworten mit Zitat

Zitat:
Was ist mit Assembler?

Assembler wird dir hier nichts bringen. Die Geschwindigkeitseinbußen bekommst du beim Leseprozess, also beim Datenaustausch zwischen Datenspeicher (Laufwerk, Stick ...) mit dem Computer. Da kann die Programmiersprache nichts machen.

Ein möglicher Ansatz wäre zunächst einmal die Wahl des Speichermediums. Von Floppy-Disc dauert es länger als von Festplatte, und beim USB-Anschluss gibt es unterschiedlich schnelle Anschlüsse. Solltest du beim Lesen von 100.000 Zeilen von Festplatte über eine Minute brauchen, würde ich über eine Erneuerung der Hardware nachdenken. Ich bin auf meinem XP-Rechner (!) auf sieben Sekunden bei 100.000 Zeilen gekommen.

Allerdings gehe ich jetzt mal davon aus, das die eingelesene Datei korrekt ist, also dass das Komma als Trennzeichen zwischen den Datensätzen dient. (Sollte es sich um dein Schach-Projekt handeln: Diese Daten sind nicht durch Komma getrennt!)

Alternativ könntest du noch versuchen, die Datensätze zeilenweise einzulesen und dann "per Hand" zu zerlegen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.10.2017, 11:24    Titel: Antworten mit Zitat

Es ist höchst unwahrscheinlich, daß die Datenübertragung (alleine) für die niedrige Geschwindigkeit verantwortlich ist. Das Schreiben von 100000 Strings á 100 Zeichen auf einen USB-Stick an einem USB 1.0 Port (die absolut langsamste Variante) dauert 32 Sekunden, das Lesen 10,7 Sekunden. Selbst wenn ich jedes Zeichen einzeln auslese, dauert es nicht länger als 25 Sekunden. Ein USB-Stick an einem USB 2.0 - Port sollte etwa um den Faktor 10 schneller sein.

Es gibt auch noch andere Zeitfallen. Die ersten Verdächtigen sind vergessene oder ungeschickt platzierte Sleep - Befehle, gefolgt von unnötigen Schleifen und redundanten Berechnungen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 01.10.2017, 15:05    Titel: Antworten mit Zitat

Wenn du sehr oft, aber sehr kleine Datenmengen einliest ist das sehr inperformant. Besser ist es wenn du größere Datenblöcke einliest und dann entsprechend verarbeitest.
Das würde aber darauf hinauslaufen dass du INPUT nicht mehr verwenden kannst, sondern dir selbst eine Lösung programmieren müsstest, die entsprechend einen Datenpuffer verwendet.
_________________
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
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.10.2017, 15:53    Titel: Antworten mit Zitat

Zitat:
Das Schreiben von 100000 Strings á 100 Zeichen auf einen USB-Stick an einem USB 1.0 Port (die absolut langsamste Variante) dauert 32 Sekunden, das Lesen 10,7 Sekunden.

Wenn Soft- und Hardware in Ordnung ist. happy Ich habe auf der Arbeit schon deutliche Hänger gesehen, die den normalen Geschwindigkeiten nicht entsprechen (z. B. braucht der eine zum Entpacken einer ZIP-Datei auf Stick etwa eine halbe Stunde, während ein anderer mit derselben Datei in einer knappen Minute fertig ist - alles schon erlebt durchgeknallt )
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 01.10.2017, 20:24    Titel: Antworten mit Zitat

Zitat:
Allerdings gehe ich jetzt mal davon aus, das die eingelesene Datei korrekt ist, also dass das Komma als Trennzeichen zwischen den Datensätzen dient. (Sollte es sich um dein Schach-Projekt handeln: Diese Daten sind nicht durch Komma getrennt!)
Es handelt sich um mein Schach-Projekt! Nicht durch Komma getrennt?

Inhalt der Datei:
Code:
"4309014","","NZL","","","","","","1717","5","40","","","",""


Es sind insgesamt 276213 Zeilen! Gerade noch mal nachgeschaut.

Auf meinem Win10 Superrechner brauche ich 6 Sekunden zum einlesen. Bei meinem uralt XP-Laptop habe ich die Zeit noch nicht gestoppt! Aber auf jeden Fall deutlich zu lang!!!

6 Sekunden sind halt 6 Sekunden Zuviel! Das sollte maximal 0.3 Sekunden dauern! Zumindest ist es bei meinem Profiprogramm so. Keine Ahnung, wie die auf so eine Zeit kommen? Mit 1 Sekunde könnte ich auch schon leben. Aber 6 Sekunden sind einfach Zuviel! Noch dazu wo es nicht einmal mein langsamster Rechner ist.

Vielen herzlichen Dank für die Informationen. Ich werde weiter testen...

Gruß ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 01.10.2017, 23:33    Titel: Antworten mit Zitat

Zitat:
Es handelt sich um mein Schach-Projekt! Nicht durch Komma getrennt?

Inhalt der Datei:
Code:
"4309014","","NZL","","","","","","1717","5","40","","","",""

Ok, dann passt es. Ich meinte das andere Dateiformat, über das wir vor kurzem diskutiert haben. lächeln

Zitat:
Zumindest ist es bei meinem Profiprogramm so. Keine Ahnung, wie die auf so eine Zeit kommen?

Vermutlich so:
St_W hat Folgendes geschrieben:
Wenn du sehr oft, aber sehr kleine Datenmengen einliest ist das sehr inperformant. Besser ist es wenn du größere Datenblöcke einliest und dann entsprechend verarbeitest.

4143195 einzelne Leseoperationen dauern halt nun mal eine Weile; da finde ich 6 Sekunden ziemlich flott. Mit zeilenweisem Einlesen hättest du nur noch 1/15 der Operationen. Bei dieser Datenmenge würde ich aber ernsthaft über ein binäres Speicherformat nachdenken und, wie von St_W vorgeschlagen, ganze Blöcke einlesen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 02.10.2017, 01:06    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Zitat:
Es handelt sich um mein Schach-Projekt! Nicht durch Komma getrennt?

Inhalt der Datei:
Code:
"4309014","","NZL","","","","","","1717","5","40","","","",""

Ok, dann passt es. Ich meinte das andere Dateiformat, über das wir vor kurzem diskutiert haben. lächeln

Zitat:
Zumindest ist es bei meinem Profiprogramm so. Keine Ahnung, wie die auf so eine Zeit kommen?

Vermutlich so:
St_W hat Folgendes geschrieben:
Wenn du sehr oft, aber sehr kleine Datenmengen einliest ist das sehr inperformant. Besser ist es wenn du größere Datenblöcke einliest und dann entsprechend verarbeitest.

4143195 einzelne Leseoperationen dauern halt nun mal eine Weile; da finde ich 6 Sekunden ziemlich flott. Mit zeilenweisem Einlesen hättest du nur noch 1/15 der Operationen. Bei dieser Datenmenge würde ich aber ernsthaft über ein binäres Speicherformat nachdenken und, wie von St_W vorgeschlagen, ganze Blöcke einlesen.


Binäres Speicherformat ist nicht, da ich nur obengenanntes Format habe! Außerdem werden die Daten nur 1x pro Programmaufruf geladen. Jetzt bin ich bei ca. 3.15 Sekunden! Vielmehr werde ich da nicht mehr machen können, wenn ich am Format nichts ändere. Das ist jetzt mein schnellster Rechner mit 8 Kernen und SSD-Festplatte 8Gb Ram. Wie das bei meinem langsamsten Computer aussieht? Das muss ich jetzt mal testen!

Selbst wenn ich die Daten in einem Binären Format habe, muss ich wieder die Daten trennen können.

Ps.: Der Tipp mit dem Zeilenweisen einlesen war gut! Jetzt konnte ich die Zeit schon mal halbieren. Auch wenn ich jetzt immer noch so wie oben die Daten einlese, ist das schon mal ein Anfang!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 02.10.2017, 02:16    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Binäres Speicherformat ist nicht, da ich nur obengenanntes Format habe! [...] Vielmehr werde ich da nicht mehr machen können, wenn ich am Format nichts ändere.

Ich hab ja nicht gesagt, dass du das Format der Daten ändern sollst, sondern die Art wie du sie einliest. Man kann jede Datei als Binärdatei einlesen, egal wie diese aufgebaut ist. Du musst dich in diesem Fall allerdings selbst um die Datenverarbeitung kümmern (also Zeilen, Felder und Werte erkennen und trennen). Zeilenweise einlesen ist sicher ein guter Anfang (und vergleichsweise einfach umzusetzen). Ich bin mir aber relativ sicher, dass es mit noch größeren Blöcken noch schneller geht.
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.10.2017, 08:46    Titel: Antworten mit Zitat

Am schnellsten dürfte das hier sein:
Code:
Dim As String d
Dim As Integer f = FreeFile
Open "C:\Test.txt" For Binary Access Read As #f
d = Input(Lof(f), #f)
Close #f
Der Inhalt der Datei steht danach 1:1 im String d (d.h. im Arbeitsspeicher). Ich verwende diese Methode schon seit Jahren zum Bearbeiten meiner Audiodateien.

Und um gleich (@ALWIM) deine nächste Frage zu beantworten: So werden die Daten aus dem String extrahiert:
Code:
Dim As Integer a, e, x
Dim As String feld(15)

a = 1 'pointer auf anfang des datenstrings
Do
   For x = 1 To 15 'alle datenfelder einer zeile in ein array einlesen
      e = InStr(a, d, Any "," + Chr(13,10)) 'nächstes komma oder zeilenende suchen
      feld(x) = Mid(d, a, e - a) 'datenfeld in array übertragen
      a = e + 1 'pointer auf nächstes datenfeld setzen
   Next
   '...
   'inhalt   bearbeiten
   '...
   Do While InStr(Chr(13,10), Mid(d,a,1)) 'pointer auf nächsten zeilenanfang setzen
      a += 1
   Loop
Loop Until a >= Len(d) 'nächste zeile oder dateiende
'...
'daten weiterbearbeiten
'...


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 02.10.2017, 15:08    Titel: Antworten mit Zitat

Code:
e = InStr(a, d, Any "," + Chr(13,10))

bleibt da beim Zeilenumbruch nicht ein Fragment CHR(10) übrig? Die Methode sucht nach dem nächsten Auftreten von "," oder CHR(13) oder CHR(10) (übrigens auch dann, wenn das "," durch Anführungszeichen geschützt ist!)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.10.2017, 21:16    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
bleibt da beim Zeilenumbruch nicht ein Fragment CHR(10) übrig?
Richtig. Aber da das immer nur beim letzten der 15 Datenfelder passiert (korrekter Datensatz vorausgesetzt), ist das kein Problem. Und für den nächsten Datensatz wird der Pointer mit
Code:
Do While InStr(Chr(13,10), Mid(d,a,1)) 'pointer auf nächsten zeilenanfang setzen
      a += 1
Loop
wieder geradegerückt. Dieses Verfahren kommt mit jeder Art von Zeilenumbruch klar: Chr(13,10), Chr(10), Chr(13) oder auch Chr(10,13).

Wenn in den Daten von Anführungszeichen eingeschlossene Kommata vorkommen (können), müsste man das natürlich noch entsprechend behandeln.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.10.2017, 21:11    Titel: Antworten mit Zitat

Grundlegende Fragen und Anregungen:
- Soll die Datei letztlich eine Array-Konstante (feste Tabelle) beinhalten?
- Datenaufbau selber: Was für eine Struktur verwendet das Ganze? Evtl. wäre TYPE (UDT) das Richtige
- Bei UDT kann problemlos Zeile für Zeile als Datenblock (Record) ab Binärdatei eingelesen werden, womit aufwändiges Parsen (macht LINE INPUT im Hintergrund!) entfällt
- Auch Array liegen im RAM normalerweise zusammenhängend, so dass ein Laden (früher in GW-BASIC das klassische BLOAD) als ebenfalls 1:1 von Disk ins RAM ohne aufwändiges Parsen möglich ist

Am besten also genau überlegen, was das Endziel schlussendlich ist

Ansonsten aber schon drandenken, dass ein extrem riesiges Array von zig Gigabyte (betreibst Du ein 19"-Rack mit Server, letzterer voll mit RAM-Riegeln bestückt, wie er typischerweise für eine Virtualisierungsplattform bei einem Hoster gebraucht wird, wo haufenweise vServer laufen?) nun einmal seine Verarbeitungszeit benötigt. Der 64-Bit-Compiler ermöglicht Dir lediglich, mit derart grossen Datenmengen (bereits Big Data-trächtig) umzugehen...

Übrigens Google, Amazon, Facebook usw. machen es bei all den einschlägigen NoSQL-Datenbankprojekten vor, was es überhaupt braucht, um riesige Datenmengen in vernünftigen Zeiten verarbeiten zu können... -> Evtl. musst Du das eine oder andere Grundkonzept daraus auch bei Deinem Schachprojekt einsetzen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 07.10.2017, 23:42    Titel: Antworten mit Zitat

Wie oben schon geschrieben. In einer Datei befinden sich ca. 4143195 solche Zeilen:
Code:
"4309014","","NZL","","","","","","1717","5","40","","","",""

Jeder Wert muss in einer Variable gespeichert werden und verarbeitet werden können! Oder besser gesagt, muss ich eine bestimmte Person in der Datei suchen und einlesen können. Das heißt, wenn die gesuchte Person in der Datei vorhanden ist, alle Daten in eine Variable speichern können!

Zitat:
betreibst Du ein 19"-Rack mit Server, letzterer voll mit RAM-Riegeln bestückt, wie er typischerweise für eine Virtualisierungsplattform bei einem Hoster gebraucht wird, wo haufenweise vServer laufen?
Nein, betreibe ich nicht.
Zitat:

Übrigens Google, Amazon, Facebook usw. machen es bei all den einschlägigen NoSQL-Datenbankprojekten vor, was es überhaupt braucht, um riesige Datenmengen in vernünftigen Zeiten verarbeiten zu können... -> Evtl. musst Du das eine oder andere Grundkonzept daraus auch bei Deinem Schachprojekt einsetzen.
Mal schauen was die anwenden bzw. verwenden. Vielleicht lässt sich ja wirklich was davon bei meinem Projekt umsetzen?

Vielen herzlichen Dank für die Informationen!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andt2018



Anmeldungsdatum: 22.12.2017
Beiträge: 7

BeitragVerfasst am: 22.12.2017, 18:44    Titel: Antworten mit Zitat

Hab's so gelöst lächeln
Code:
sub write_string (s as string,filenr as integer)
    dim as integer length = len(s)
    dim as ubyte buffer(length)
    put #1,,length
    for i as integer = 0 to length-1
        buffer(i) = s[i]
    next
    put #1,,buffer()
end sub

sub write_val (value as uinteger,filenr as integer)
    write_string str(value),filenr
end sub


function read_string (filenr as integer) as string
    dim as integer length
   
    get #1,,length
    dim as string s = space(length)
    dim as ubyte buffer(length)
    get #1,,buffer()
    for i as integer = 0 to length-1
        s[i] = buffer(i)
    next
    return s
end function

function read_val (filenr as integer) as integer
    return val(read_string(filenr))
end function

'beispiel

open "test" for binary as #1
write_string "TEST",1
write_string "NOPE",1
write_val 12345,1
write_val 54321,1

seek #1,1 ' auf byte 1 zum auslesen setzen..
print read_string(1)
print read_string(1)
if read_val(1)+read_val(1)=66666 then print "Variablen korrekt ausgelesen.. ;)"
sleep
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