Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal Eine sehr große textbasierte Datei durchsuchen? (https://www.delphipraxis.net/194540-eine-sehr-grosse-textbasierte-datei-durchsuchen.html)

begin.delphi 5. Dez 2017 13:52

Eine sehr große textbasierte Datei durchsuchen?
 
Hallo Delphianer,

mein erstes Thema und ich habe folgende Frage. Aber vorher kurz zu mir: Delphi hatte ich mal vor vielen Jahren in der Schule, seit dem habe ich mit Delphi kaum was gemacht. Und nun zu meiner Frage:

Ich möchte eine sehr große textbasierte Datei durchsuchen, nämlich eine GEDCOM-Datei (https://de.wikipedia.org/wiki/GEDCOM). Diese ist ca. 1GB groß und ich glaube diese kann ich nicht wie eine KB-große Datei einfach so in den RAM laden. Was gibt es für Techniken, um mit großen Dateien zu arbeiten, und vorallem relativ schnell?

Gruß
Johann

Namenloser 5. Dez 2017 13:57

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Hi,

als ersten Schritt würde ich mir mal TFileStream bzw. TStream anschauen. Damit kannst du eine Datei häppchenweise verarbeiten, ohne sie komplett in den RAM zu laden.

Sherlock 5. Dez 2017 14:01

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Lade die Datei in ein Delphi-Referenz durchsuchenSystem.Classes.TFileStream-Objekt. Mit den Methoden Seek und Read solltest Du für den Fall, daß Du nur bestimmte Eintragungen suchst dann ganz passabel zum Ziel kommen. Falls du den kompletten Dateiinhalt in Pascal-Objekte Umwandeln möchtest, mußt du halt von Anfang bis Ende auslesen, dazu reicht ja ein wiederholtes Read.

Sherlock

TiGü 5. Dez 2017 14:01

AW: Eine sehr große textbasierte Datei durchsuchen?
 
OT:
1 GB große GEDCOM Datei? Wieviele Personen sind denn darin? :shock:

begin.delphi 5. Dez 2017 14:12

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von TiGü (Beitrag 1387988)
OT:
1 GB große GEDCOM Datei? Wieviele Personen sind denn darin? :shock:

Ein Paar Millionen. Ist schon was...

TiGü 5. Dez 2017 14:18

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Ist das ein Textbackup der Datenbank von FamilySearch?
Ein einzelner Mensch kann ja unmöglich soviele Daten zusammentragen.

begin.delphi 5. Dez 2017 14:27

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von TiGü (Beitrag 1387992)
Ist das ein Textbackup der Datenbank von FamilySearch?
Ein einzelner Mensch kann ja unmöglich soviele Daten zusammentragen.

Ist ein Ahnenforschungsprojekt, in der Datei ist eine Volksgruppe eingetragen und ihre Vorfahren der letzten 500 Jahre. Willst Du mit machen?

himitsu 5. Dez 2017 14:31

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Die alten Dateifunktionen ala Delphi-Referenz durchsuchenReadLn funktionieren immernoch, auch über 2GB hinaus, wenn man ausschließlich sequentiell liest.
Also falls dir "schnell" egal ist und es auch ruhig langsamer und einfach sein darf.

Es gibt hier auch mehrere Komponenten zu finden, welche die Datei stückchenweise in den Speicher laden können.
[DP]große Textdateien[/DP]

begin.delphi 5. Dez 2017 14:33

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Ja, es geht nur ums Lesen, mehr nicht. Ok, ich schaue mal was sich besser umsetzen lässt, TFileStream oder ReadLn. Und vielen Dank erst mal!

TiGü 5. Dez 2017 15:08

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von begin.delphi (Beitrag 1387993)
Zitat:

Zitat von TiGü (Beitrag 1387992)
Ist das ein Textbackup der Datenbank von FamilySearch?
Ein einzelner Mensch kann ja unmöglich soviele Daten zusammentragen.

Ist ein Ahnenforschungsprojekt, in der Datei ist eine Volksgruppe eingetragen und ihre Vorfahren der letzten 500 Jahre. Willst Du mit machen?

Habt ihr eine Projektseite oder ähnliches für weitere Informationen?

Ich kenne bspw. die Ahnengemeinschaft aus Sachsen, aber die haben nur 179013 Personen im Stammbaum und es arbeiten 476 Menschen daran mit.
https://www.myheritage.de/site-10990...ft-aus-sachsen

begin.delphi 5. Dez 2017 15:34

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Siehe PN.

LTE5 5. Dez 2017 16:26

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Schneller als das hier geht bestimmt aber es ist allemal schneller als alles was man sich selber baut
http://www.delphipraxis.net/151898-s...ei-reader.html

p80286 5. Dez 2017 23:05

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Ich würde da jetzt keinen Gedanken an Text-Dateien verschwenden, sondern gleich eine Datenbank nutzen.

spätestens bei der dritten Suchanforderung ist die im Vorteil.

Gruß
K-H

jobo 5. Dez 2017 23:08

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Was bedeutet "arbeiten und vor allem schnell" konkret?
Ist es die "aktuelle" GEDCOM Version?
Gibt es irgendwo Beispieldaten?

begin.delphi 6. Dez 2017 09:52

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von jobo (Beitrag 1388017)
Was bedeutet "arbeiten und vor allem schnell" konkret?
Ist es die "aktuelle" GEDCOM Version?
Gibt es irgendwo Beispieldaten?

Unter arbeiten meine ich die ged-Datei lesen. Aber auch nicht alles, sondern nur nach bestimmten Namen suchen. Und mit schnell meine ich irgendwelche Vorgehensweise (TFileStream oder ReadLn) die schneller als die restlichen ist. Aus diesen zwei wäre das z.B. TFileStream.

Die eigentliche Datei habe ich noch nicht, aber eine Test-Datei, die ich mir selber erstellt habe. Meine, aber auch die eigentliche die ich noch bekomme, sind in der 5.5.1 Version.

p80286 6. Dez 2017 10:18

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von begin.delphi (Beitrag 1388034)
Unter arbeiten meine ich die ged-Datei lesen. Aber auch nicht alles, sondern nur nach bestimmten Namen suchen.

Je nachdem was Du suchst, erstes Vorkommen/alle Vorkommen, wird Dir nichts anderes übrig bleiben als die Datei vollständig zu lesen.

Gruß
K-H

begin.delphi 6. Dez 2017 10:22

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von p80286 (Beitrag 1388038)
Zitat:

Zitat von begin.delphi (Beitrag 1388034)
Unter arbeiten meine ich die ged-Datei lesen. Aber auch nicht alles, sondern nur nach bestimmten Namen suchen.

Je nachdem was Du suchst, erstes Vorkommen/alle Vorkommen, wird Dir nichts anderes übrig bleiben als die Datei vollständig zu lesen.

Gruß
K-H

So wie ich das verstehe kann ich in der *.ged nicht wie bei XML zwischen Tags springen, da muss ich wohl wirklich die *.ged komplet linear lesen.

himitsu 6. Dez 2017 10:39

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Wenn der Inhalt sortiert ist, also in deinem Fall nach Namen, wenn du nach Namen suchen willst, dann kann man die Datei schon sehr schnell "überfliegen" und muß nicht alles lesen.

Man könnte sich vorher auch einen Index aufbauen, wo der Anfang jedes Datensatzes in einer Namensliste steht, um schnell zum gewünschten Datensatz springen zu können.
Vorallem wenn man mehrmals nacheinander sucht und die Liste der zu suchenden Namen nicht vorrher bekannt ist und man die nicht einfach in einem Lesedurchgang gemeinsam suchen könnte.

TiGü 6. Dez 2017 10:46

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Wenn es nur darum geht, das du für dich persönlich Informationen rausfischst, dann kannst du auch das kostenlose Notepad++ versuchen. Sehr mächtiger Editor.

EDIT: Vergiss es, ab 1 GB macht der auch die Grätsche und sagt, dass die Datei zu groß ist.

p80286 6. Dez 2017 11:28

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von himitsu (Beitrag 1388041)
Wenn der Inhalt sortiert ist, also in deinem Fall nach Namen, wenn du nach Namen suchen willst, dann kann man die Datei schon sehr schnell "überfliegen" und muß nicht alles lesen.

Man könnte sich vorher auch einen Index aufbauen, wo der Anfang jedes Datensatzes in einer Namensliste steht, um schnell zum gewünschten Datensatz springen zu können.
Vorallem wenn man mehrmals nacheinander sucht und die Liste der zu suchenden Namen nicht vorrher bekannt ist und man die nicht einfach in einem Lesedurchgang gemeinsam suchen könnte.

Und der Index fällt vom Himmel?

Wenn die Datei vorhanden ist, kennt man vllt. die Struktur, aber nicht den Inhalt. Der erschließt sich erst beim Lesen. Und irgendwie werde ich das Gefühl nicht los, daß es nicht darum geht einen Namen zu finden, sondern einen Datensatz, der an Hand eines Namens identifiziert wird.

@begin.delphi
Auch XML Dateien wollen gelesen werden, da gibt es kein umherspringen zwischen den Knoten ohne daß Daten gelesen werden. Das ist manchmal nicht offensichtlich aber es geht wirklich nicht ohne.

Gruß
K-H

begin.delphi 6. Dez 2017 11:41

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von p80286 (Beitrag 1388046)

Wenn die Datei vorhanden ist, kennt man vllt. die Struktur, aber nicht den Inhalt. Der erschließt sich erst beim Lesen. Und irgendwie werde ich das Gefühl nicht los, daß es nicht darum geht einen Namen zu finden, sondern einen Datensatz, der an Hand eines Namens identifiziert wird.

Ja, das stimmt. Da muss der passende Nachname gefunden werden, und wenn das gefunden wird, muss das Jahr ausgelesen werden, wann es diesen Nachnamen gab. Mehr nicht.

bra 6. Dez 2017 11:47

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Ich würde auch sagen dass die Daten in eine Datenbank überführt werden sollten. Alles andere ist doch ein Heidenaufwand mit vermutlich unterirdischer Geschwindigkeit.

jobo 6. Dez 2017 11:49

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von begin.delphi (Beitrag 1388034)
Unter arbeiten meine ich die ged-Datei lesen. Aber auch nicht alles, sondern nur nach bestimmten Namen suchen. Und mit schnell meine ich irgendwelche Vorgehensweise (TFileStream oder ReadLn) die schneller als die restlichen ist. Aus diesen zwei wäre das z.B. TFileStream.

Arbeiten:
Gut, ich meinte eigentlich nur die funktionalen Seite. Was sind die "Arbeits"Szenarien/Anforderungen?
Einen(1) Namen suchen bedeutet idR in einer solchen Datei, dass man zunächst den ersten findet
-wenn die Codierung stimmt. Und:
Formatbedingt kommen solche Gemeinheiten dazu, das Werte in mehreren Zeilen verstreut stehen können, Steuerzeichen dazwischen. Das findet man ohne passende Algorithmen nie, wenn man die Rohdaten durchsucht.

Wie auch immer, findet man was, dann kann man weitersuchen, (über)springen, ausschließen, anzeigen usw.
Man kann auch alle Zeilen suchen, in denen dieser Name vorkommt
oder hier vielleicht besser alle Zeilengruppen, wo er vorkommt.

Schnell:
Auch hier interessiert mich eher, was schnell wäre in Sekunden, nicht welche Technik.
In einer 2 GB Logdatei Suche nach einem Wert der ziemlich am Ende steht dauert mit einem alten Ultraedit bei mir grad ca 30 Sekunden. Ein "gib mir alle Zeilen mit [einBestimmterWert]" hab ich noch nicht probiert, dauert vermutlich genauso lang, wenn es geht.

Worauf ich hinaus will:
Wenn Du nur 10 Namen suchen musst und dann fertig bist, nimm einfach einen geeigneten Editor.
Wenn du mehr "musst", dann wäre es bei dem Volumen nicht verkehrt, die Anforderungen genauer zu kennen und dann eine geeignete Technik zu suchen.

BTW
Es gibt Opensource Software, die GEDCOM kann. Hast Du die schon probiert? Versagen sie den Dienst?

P.S: Ich seh grad, das Thema Anforderungen und geeignete Technik ist eh schon im Gang.

himitsu 6. Dez 2017 12:33

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von p80286 (Beitrag 1388046)
Zitat:

Zitat von himitsu (Beitrag 1388041)
...
Man könnte sich vorher auch einen Index aufbauen, wo der Anfang jedes Datensatzes in einer Namensliste steht, ...

Und der Index fällt vom Himmel?

aufbauen :zwinker:

Am Anfang einmal die Datei durchlaufen und in 'ner Liste das speichern (TStringList/TDictionary<>/...)

Es kommt vorallem darauf an wie oft er in dieser Datei was sucht.
Man kann den Inhalt auch in eine Datenbank schieben und dort weiterarbeiten.

p80286 6. Dez 2017 13:01

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von himitsu (Beitrag 1388061)
Zitat:

Zitat von p80286 (Beitrag 1388046)
Zitat:

Zitat von himitsu (Beitrag 1388041)
...
Man könnte sich vorher auch einen Index aufbauen, wo der Anfang jedes Datensatzes in einer Namensliste steht, ...

Und der Index fällt vom Himmel?

aufbauen :zwinker:

Am Anfang einmal die Datei durchlaufen und in 'ner Liste das speichern (TStringList/TDictionary<>/...)

Genau! Den meisten von uns ist klar, das die Datei mindestens einmal vollständig gelesen werden muß. Alle weiteren Zugriffe sind dann je nach gewählter Technik weniger aufwendig. Nur es geht nicht ohne mindestens einmal vollständiges Lesen.

Gruß
K-H

himitsu 6. Dez 2017 14:52

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Zitat:

Zitat von p80286 (Beitrag 1388065)
Nur es geht nicht ohne mindestens einmal vollständiges Lesen.

Wenn die Daten in der Datei sortiert sind, dann muß man nicht vollständig lesen.

https://de.wikipedia.org/wiki/Bin%C3%A4re_Suche
- zur Mitte
- den Anfang des Blocks suchen
- schauen ob passend oder größer/kleiner
- wenn nicht passend, dann zur Mitte des Blocks davor oder dahinter usw.

Delphi.Narium 6. Dez 2017 15:18

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Die binäre Suche dürfte schwierig werden, man hat (selbst bei Sortierung) nicht eine Information pro Zeile (dann ginge das) sondern eine Information verteilt sich auf n bis m Zeilen.

Selbst wenn man das in eine Datenbank packt, muss man da erstmal eine 1 : n : m : keineahnungwieviele-Beziehung "aufbröseln".

Ein paar (kleine) Testdateien sind hier zu finden: http://www.familienbande-genealogie....ad/TestGED.zip

TiGü 6. Dez 2017 15:35

AW: Eine sehr große textbasierte Datei durchsuchen?
 
Wer sich mal richtig austoben will:
http://genealogyoflife.com/tng/gedcom/Royal92.ged

3010 Personen. Europäische Königshäuser.

Kostenlose Windows-Software zum Anschauen:
http://www.ahnenblatt.de/


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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