Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 27.02.2005, 11:21 Titel: Geschwindigkeit zu langsam |
|
|
Hallo erst Mal.
Ich besitze eine Datei für ein Englischwörterbuch, die sieht etwa so aus:
hello=Hallo! / Guten Tag!
house=Haus / Gebäude / Wohnung
keep=halten / festhalten / bewahren / zurückhalten
...
Diese Datei besteht aus abertausend Zeilen. Wenn ich in meinem Programm jetzt "hello" eingebe, erscheint die deutsche Übersetzung auf dem Bildschirm, also: Hallo! / Guten Tag!
Jetzt gelang es mir aber auch eine Rückübersetzung zu entwickeln, sodass, wenn ich "Hallo" eingebe, hello erscheint. Das geht wiefolgt:
Eine Zeile der Datei wird eingelesen (Open-Anweisung) und die Zeichen 1 bis 16 der Zeile werden gefiltert und zu einem String zusammengefügt. Nach obigen Beispiel also: "hello=Hallo! / G". Anschließend werden die Zeichen 2 bis 17 ("ello=Hallo! / Gu"), 3 bis 18 (llo=Hallo! Gut") usw. eingelesen, bis zum Ende der Zeile. Ist das gesuchte Wort in dieser Zeile enthalten, so wird es auch gefunden und das Wort vor dem = wird in eine externe Datei gelagert und von meinem Hauptprogramm eingelesen. Anschließend wird die nächste Zeile usw. bis zum Dateiende eingelesen. Das System funktioniert, es gibt kleinere Fehler, aber die Deutsch-Englisch-Übersetzung klappt. Nur: Durch die Byte-für-Byte-Einlesung der Zeilen dauert ein Übersetzungsvorgang etwa 45 Sekunden lang, bietet also keinerlei Vorteile gegenüber einem Wörterbuch. Gibt es eine Möglichkeit, die Zeit zu verkürzen? Gibt es vielleicht sogar eine andere Möglichkeit, um das doch recht komplizierte Verfahren zu vereinfachen? Gibt es andere Möglichkeiten, dass die exe-Dateien noch schneller ausgeführt werden (habe bereits compilierte exe-Dateien erstellt). Über Tipps wäre ich sehr dankbar.  |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.02.2005, 12:43 Titel: |
|
|
Hallo!
Mit dem Befehl INSTR kannst du herausfinden, ob und wo ein String in einem anderen enthalten ist. Sieh dir dazu doch mal die Erklärung in der QB-Onlinehilfe an oder die QB-Monster-FAQ auf www.qbasic.de . Dort gibt es - wie zu fast allem - auch eine Erklärung.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Markus
Anmeldungsdatum: 16.09.2004 Beiträge: 104 Wohnort: Wien
|
Verfasst am: 27.02.2005, 14:08 Titel: |
|
|
Hi,
1) Ram-Disk für erstellte Wort-Datei benutzen bzw. alle Dateien nach Programmstart dorthin kopieren und von dort einlesen. Geht x-fach schneller.
2) Aufteilen des Vokabel-files nach Anfangsbuchstaben der Worte in 26 Dateien (A.txt, B.txt); so müssen nur diese gelesen werden.
3) INSTR benutzen
4) kein = benutzen, sondern mit Beistrich trennen. Dann kann mit input a$,b$ sowohl Wort als auch Übersetzung schnell gelesen werden
Mehr fällt mir auch nicht ein...
Markus |
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 28.02.2005, 23:00 Titel: |
|
|
Die Benutzung des Befehls INSTR hat mir echt weitergeholfen. Die Suchzeit konnte ich von 43 Sekunden auf 5 Sekunden minimieren. Vielen Dank für die heißen Tipps.  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 28.02.2005, 23:07 Titel: |
|
|
Bei ganz extrem grossen Datenbanken/Wortlisten eignet sich lineares Suchen in einer sequenziellen Datei bereits nicht mehr => hier muss man dann mit einem Index arbeiten. Vom Suchbegriff berechnet man in der Regel einen Hash, die Datenbankdatei enthält Zeiger - kann man in QB mit SEEK auf Binärdateien ebenfalls implementieren.
Beispiel einer primitiven Hash-Variante: Die Wörter werden alphabetisch sortiert abgelegt und eine zweite Datei mit Länge 104 Bytes beinhaltet nur die SEEK-Positionszeiger zu jedem Buchstaben innerhalb der grossen Datei. => Somit würde sich der Suchaufwand bereits auf 1/26 reduzieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|