AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi 2 Gigabyte grosse Datei blockweise durchsuchen
Thema durchsuchen
Ansicht
Themen-Optionen

2 Gigabyte grosse Datei blockweise durchsuchen

Ein Thema von tuebben · begonnen am 28. Dez 2006 · letzter Beitrag vom 31. Dez 2006
Antwort Antwort
tuebben

Registriert seit: 6. Sep 2006
Ort: in der Nähe von Köln
12 Beiträge
 
Turbo Delphi für Win32
 
#1

2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 14:46
Hallo,

als Delphi-Noob stehe ich momentan vor der Aufgabe, sehr große Text-Dateien (bis zu 2 Gigabyte) nach bestimmten Schlüsselwörtern
durchsuchen zu müssen. Diese können sowohl im ASCII- als auch im Unicode-Format vorliegen.

Ich würde dann die Datei öffnen und blockweise einlesen. Jeden Block durchsuche ich nach dem Schlüsselwort und merke mir dann die
Position in der Datei. Bevor ich den nächsten Block lese, setze ich den Filepointer um ein paar Bytes zurück, damit ich
Schlüsselwörter, die zwischen 2 Blocks liegen auch erfassen kann.

Nun wollte ich an dieser Stelle nach einer geeigneten Vorgehensweise fragen. Einige Recherchen in diesem Forum ergaben, dass
anscheinend TFileStream das Mittel der Wahl ist. Ist das so korrekt? Würdet Ihr für die Aufgabenstellung ebenfalls TFileStream
benutzen?

Zum Merken der Positionen der Schlüsselwörter in der Datei würde ich ein Objekt benötigen, was einer VB-Collection (also eine
dynamische Liste, der man zur Laufzeit beliebig Items anhängen kann) gleichkäme. Welches Objekt würde ich dann in Delphi verwenden
können?

Danke im voraus & Grüße ... Peter

// Edit:

Wichtige Info noch als Nachtrag: Die zu durchsuchenden Dateien haben keinen Zeilenumbruch.
Ein zeilenweises Einlesen ist somit nicht möglich.
Peter Tübben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 15:02
Eventuell wären auch MemoryMappedFiles für dich geeignet ... dort kannst du sie datei stückchenweise in den Speicher mappen und ganz einfach in dem gemappten Speicher rumsuchen


Schau mal da ReadFileScatter/WriteFileGatter in den Dateianhang, dort sind auch andere Möglichkeiten zum Dateieinlesen gegeben (Win-API).



PS: TFileStream ist auch nur eine Klasse, welche intern (wie alle anderen Delphi-Funktionen/-Klassen) auf ReadFile/WriteFile (Win-API) zugreift.

Im MSDN / PSDK findest du genaueres zu den Funktionen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 15:05
Ein TFileStream-Objekt ist schon richtig. Als Liste würde ich eine TStringlist verwenden.

Wenn Du viel Zeit hast, dann reicht ein generisches Suchen, wobei ich zunächst den jeweils 1. Buchstaben mit den Schlüsselwörtern der Stringliste vergleichen würde, und erst wenn da ein Treffer ist, mal genauer hinschauen.

Wenn Du Dir etwas komplexere Algorithmen zutraust, dann schau mal nach KMP oder ähnlichen Verfahren, die solch 'Multi-Wort' Suche sehr effizient implementieren.

Wenn Du sehr lange Schüsselwörter hast, lohnt ein Blick auf Horspool, Boyer-Moore oder 'Quicksearch'.

Genaueres findest Du hier:

http://www-igm.univ-mlv.fr/~lecroq/string/index.html
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 15:06
Hi,
dein Ansatz auf TFileStream zu setzen ist imho gar nicht schlecht, kannst du sehr einfach verwenden und spricht nichts ernsthaft gegen.

Was die Positionen und das dyn. Speichern angeht, hast du gleich mehrere Möglichkeiten. Die erste (von der ich dir gleich abraten möchte) besteht darin, dass du ein dyn. Array verwendest. Hier kannst du mittels setLength die Länge dyn. anpassen, was intern aber zum neu allozieren von Speicher und umkopieren der alten Daten führt (also ein eher großer Overhead). Hier kannst du natürlich einfach mehr Speicher reservieren als du benötigst (der Overhead pro Element sinkt entsprechend ab), musst dann allerdings natürlich auch verwalten wieviele Elemente tatsächlich benutzt werden.
Da gibt es eine Klasse TList, die nimmt dir genau das ab. Intern wird zwar ein Array verwendet, aber diese Klasse kümmert sich bereits um die Verwaltung der Größe (du musst nicht mehr machen als Elemente mit Add einfügen). TList speichert dabei einfach Pointer, hier kannst du also die Adresse beliebiger Daten ablegen (oder gleich die 32 Bit als Position missbrauchen).
Verwendest du wirklich Objekte (also Instanzen von Klassen), so kannst du auf TObjectList zurückgreifen. Im Prinzip funktioniert diese Liste wie TList, du kannst in ihr aber nur Objekte (Referenzen auf diese) speichern. Der Vorteil dabei liegt dann darin, dass jedes Objekt einen Destruktor haben muss, der sich um die Freigabe des Speichers kümmert. Die TObjectList kann somit auch aut. für die Freigabe aller gespeicherten Elemente sorgen, bei der TList musst du dich selbst darum kümmern.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 15:14
Moin Peter,

Zitat von Der_Unwissende:
was intern aber zum neu allozieren von Speicher und umkopieren der alten Daten führt
AFAIK aber nur dann, wenn die neue Länge grösser als die alte ist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 28. Dez 2006, 15:20
Zitat von Christian Seehase:
Moin Peter,

Zitat von Der_Unwissende:
was intern aber zum neu allozieren von Speicher und umkopieren der alten Daten führt
AFAIK aber nur dann, wenn die neue Länge grösser als die alte ist.
Sorry, bin hier implizit davon ausgegangen, dass die Liste die der Threadsteller sucht wohl nur wächst und habe mich darauf bezogen. Zu dem anderen Fall kann ich nichts sagen, würde aber einfach mal sagen, dass du da mit hoher Wahrscheinlichkeit recht hast!
  Mit Zitat antworten Zitat
tuebben

Registriert seit: 6. Sep 2006
Ort: in der Nähe von Köln
12 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 30. Dez 2006, 13:25
Hallo,

vielen lieben Dank für die vielen und prompten Antworten!

Leider kann ich momentan Eure Tipps nicht ausprobieren, weil mein Turbo Delphi nicht mehr startet.
Ich habe die letzten 2 Tage damit verbracht, der Ursache auf den Grund zu gehen, leider erfolglos.

Wenn ich ein neues VCL-Projekt starten will (mit F9), hängt sich TD einfach auf.
Die Prereqs sind alle installiert worden. So langsam bin ich mit meinem Latein am Ende.

Nochmals Danke & Grüße ... Peter
Peter Tübben
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 30. Dez 2006, 15:06
Moin Peter,

solltest Du es noch nicht gemacht haben, dann könntest Du zu diesem Problem einfach mal einen neuen Thread aufmachen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
tuebben

Registriert seit: 6. Sep 2006
Ort: in der Nähe von Köln
12 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: 2 Gigabyte grosse Datei blockweise durchsuchen

  Alt 31. Dez 2006, 14:31
Zitat von Christian Seehase:
solltest Du es noch nicht gemacht haben, dann könntest Du zu diesem Problem einfach mal einen neuen Thread aufmachen.
[X] Done

Ich wollte vorher noch einige Sachen ausprobieren, bevor ich Euch damit belästige.

Grüße ... Peter
Peter Tübben
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:21 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