| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 01.10.2017, 02:00    Titel: Geschwindigkeit erhöhen beim Load-Befehl? |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.10.2017, 08:24    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 01.10.2017, 11:24    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| St_W 
 
  
 Anmeldungsdatum: 22.07.2007
 Beiträge: 958
 Wohnort: Austria
 
 | 
			
				|  Verfasst am: 01.10.2017, 15:05    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.10.2017, 15:53    Titel: |   |  
				| 
 |  
				|  	  | 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.
  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  ) _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 01.10.2017, 20:24    Titel: |   |  
				| 
 |  
				| Es handelt sich um mein Schach-Projekt! Nicht durch Komma getrennt? 	  | 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!) | 
 
 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.10.2017, 23:33    Titel: |   |  
				| 
 |  
				|  	  | 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.
   
 
  	  | 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 |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 02.10.2017, 01:06    Titel: |   |  
				| 
 |  
				|  	  | 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.
   
 
  	  | 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 |  |  
		|  |  
		| St_W 
 
  
 Anmeldungsdatum: 22.07.2007
 Beiträge: 958
 Wohnort: Austria
 
 | 
			
				|  Verfasst am: 02.10.2017, 02:16    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 02.10.2017, 08:46    Titel: |   |  
				| 
 |  
				| Am schnellsten dürfte das hier sein: 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. 	  | 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
 | 
 
 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 02.10.2017, 15:08    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 02.10.2017, 21:16    Titel: |   |  
				| 
 |  
				| 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 	  | nemored hat Folgendes geschrieben: |  	  | bleibt da beim Zeilenumbruch nicht ein Fragment CHR(10) übrig? | 
 wieder geradegerückt. Dieses Verfahren kommt mit jeder Art von Zeilenumbruch klar: Chr(13,10), Chr(10), Chr(13) oder auch Chr(10,13). 	  | Code: |  	  | Do While InStr(Chr(13,10), Mid(d,a,1)) 'pointer auf nächsten zeilenanfang setzen a += 1
 Loop
 | 
 
 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 |  |  
		|  |  
		| dreael Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 06.10.2017, 21:11    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 07.10.2017, 23:42    Titel: |   |  
				| 
 |  
				| 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!
 
 
 Nein, betreibe ich nicht. 	  | 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? | 
 
 Mal schauen was die anwenden bzw. verwenden. Vielleicht lässt sich ja wirklich was davon bei meinem Projekt umsetzen? 	  | 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.
 | 
 
 Vielen herzlichen Dank für die Informationen!
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| Andt2018 
 
 
 Anmeldungsdatum: 22.12.2017
 Beiträge: 7
 
 
 | 
			
				|  Verfasst am: 22.12.2017, 18:44    Titel: |   |  
				| 
 |  
				| Hab's so gelöst   
  	  | 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 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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.
 
 |  |