AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi (sehr) große Datei SCHNELL nach mehreren Strings durchsuchen

(sehr) große Datei SCHNELL nach mehreren Strings durchsuchen

Offene Frage von "wth"
Ein Thema von wth · begonnen am 17. Nov 2008 · letzter Beitrag vom 17. Nov 2008
Antwort Antwort
wth

Registriert seit: 17. Sep 2008
43 Beiträge
 
RAD-Studio 2009 Arc
 
#1

(sehr) große Datei SCHNELL nach mehreren Strings durchsuchen

  Alt 17. Nov 2008, 19:30
Hallo,

Ich habe eine große Datei (2 GB oder größer) und versuche gerade diese nach mehreren Zeichenketten zu durchsuchen.
Das ganze muss möglichst schnell sein.

So mache ich es bisher:

1. Lese ich einen Block aus der Datei. (~20000 Zeichen oder mehr; "BlockRead()")
2. Splitte/Explode ich diesen Block in ein String-Array mit dem Delimiter CRLF.
3. Sortiere ich das Array. ("Quicksort()")
4. Suche ich die Zeichenketten mittels einer Binären-Suche, da das Array ja sortiert ist. (das geht auch noch recht schnell)

Das Auslesen und das Suchen geht recht schnell, nur das Aufsplitten und das Sortieren des Arrays verbrauchen viel zu viel Zeit. (hauptsächlich wohl das Splitten)
Ich habe schon versucht den Block mit Pos() zu durchsuchen und die Datei zeilenweise auszulesen und zu vergleichen, ist aber beides einfach zu (viel) langsam.
Die Datei ist ganz einfach aufgebaut, jede Zeile eine Zeichenkette getrennt durch CRLF's.
Ich habe schon mehrere Split/Explode Varianten ausprobiert, auch die optimierte Version hier aus dem Forum.
Man kann die Datei auch nicht komplett in den Speicher laden, dafür ist sie zu groß.
Bisher lese ich die Datei mit den Pascal-Dateiroutinen, habe es aber auch schon mit FileStream versucht, ist aber genauso langsam.

Hat jemand noch ne Idee, wie das vielleicht schneller gehen könnte?

Danke schonmal.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 19:36
"grep" ist ein Kommandozeilentool, das das sehr schnell macht.

Ansonsten wäre Quicksearch, Boyer-Moore o.ä. etwas für Dich. Dabei musst Du allerdings deine Strategie überdenken, denn wenn du einfach Blockweise einliest, überliest du die Zeichenketten, die am Ende des einen Blocks anfangen und am Anfang des nächsten Blockes aufhören.

Eine sehr schnelle Stringmatching-Suche findest Du bei der 'FastString' Sammlung oder dem FastCode-Projekt (einfach mal googeln).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 19:39
Ich glaube es ist schon länger her, aber in einer c't stand einmal ein Artikel über Mustersuche. Ich glaube es war dieser Artikel
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 19:45
Ich glaube bei der ursprünglichen Methode fängt der Performanceverlust bei Schritt 2 an. Beim Splitten werden alle Daten schon angerührt und nach einem CRLF durchsucht. Wenn man sich das 2 bis 3 mal auf der Zunge zergehen lässt weiß man wo man schon ansetzen kann. Wenn man nach einem CLRF sucht kann man auch gleich nach dem richtigen Muster suchen.
Auf jeden Fall sollten die Daten so wenig wie möglich angefasst werden, im optimalfall eben nur einmal.
Ich frage mich bei solchen Sachen immer: "wie macht man das im Alltag als Mensch"
Ich für meinen Teil würde den ersten Teil mit einem Blick erfassen und darin den Anfang des zu suchenden versuchen zu erspähen. Wenn ich den Anfang erspähe schaue ich genauer hinn, wenn ich ihn nicht erspähe wandern meine Augen auf das nächste Stück. Das gleiche würde ich dann versuchen in Quelltext zu fassen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
wth

Registriert seit: 17. Sep 2008
43 Beiträge
 
RAD-Studio 2009 Arc
 
#5

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 19:48
Danke erstmal an alle. Ich probiere mal alles aus und melde mich dann wieder.

Bis demnächst!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 19:58
Es gibt auch Algorithmen, um simultan nach mehreren Strings in einem Text zu suchen. Eine Variante habe ich hier mal gepostet, ein paar weitere solcher Algorithmen gibts hier.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 21:38
Ich würde auch sagen, dass es am besten ist, erst nur nach dem Anfangsbuchstaben
zu suchen, und danach erst genauer hinzuschauen.

Wenn du das nich so machst, MUSST du jeden Teil mehrmals anpacken.

Außerdem sollte es viel schneller sein, nur nach einem einzigen Byte zu suchen.

MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 21:41
olee, schau Dir mal die von mir erwähnten Algorithmen an. Dein Ansatz ist eben der Langsamste.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.112 Beiträge
 
Delphi 12 Athens
 
#9

Re: (sehr) große Datei SCHNELL nach mehreren Strings durchsu

  Alt 17. Nov 2008, 22:24
Bezüglich des Suchens, was interessiert dich denn da?
- nur "ist mindestens eine der Zeichenfolgen irgendwo in der Datei enthalten?"
- oder willst du auch noch wissen was davon und wo es in der Datei (Zeile oder Dateiposition/Byte) gefunden wurde?

- entspricht das Gesuchte jeweils einer ganzen Zeile und nur einem Teil einer Zeile?

- Und wird CaseSensitive gesucht?



PS:
Sortieren = alles miteinander Vergleichen
Suchen = einwas mit durchschnittlich einem Teil vergleichen

ich weiß jetzt nicht wieviele Zeichenketten du suchen mußt, aber so wie es aussieht, kann es auch schneller sein garnicht zu sortieren und direkt im unsortierten zu suchen

PSS:
Zitat:
1. Lese ich einen Block aus der Datei. (~20000 Zeichen oder mehr; "BlockRead()")
hast du auch bedacht, was passiert, wenn das Gesuchte gerade im Übergang zweier Blöcke liegt?
(also Zeichenkettenangang am Ende des einen Blocks und das Zeichenkettenende am Anfang des nachfolgenden Blocks)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz