AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Lesen, Schreiben und mehr in Textdateien - TFileStream, ...?
Thema durchsuchen
Ansicht
Themen-Optionen

Lesen, Schreiben und mehr in Textdateien - TFileStream, ...?

Ein Thema von Totti · begonnen am 12. Nov 2005 · letzter Beitrag vom 4. Dez 2005
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von himitsu
himitsu

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

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 27. Nov 2005, 22:35
Zitat von alzaimar:
Äh, dem TFilestream.seek ist es doch völlig egal, wohin es den FilePointer per 'Seek' hinschiebt. Ergo geht TFileStream.Seek mit allen Dateien. Ausnahmslos.
OK, mit FileStreams kenn ich mich nicht extrem gut aus, aber bei 'ner normalen "TextFile" geht das mit dem Seek halt nicht ... jedenfalls nicht bei der von Borland mitgelieferten Seek-Funktion
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#22

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 28. Nov 2005, 11:46
Okay, habe mit unten stehendem Code mal die Zeit gemessen
a) Einlesen in ein Array mittels textfile
b) Nutzen einer TStringList

Habe jeweils eine 1,6MB große Textdatei mit ca 280.000 Zeilen eingelesen und dann nach einer Zeile gesucht.
Es wird auch jeweils wieder der Speicher freigegeben (hoffe ich ^^).

Die Methode a) ist definitiv schneller (liegt meist bei ~92ms) als b) (meist ~125ms). Sind zwar nur 30ms ...
wenn mans aber 30x macht, isset schon ne Sekunde ... bei 3.000 Aktionen hat man 10 Sekunden

Nehme jedoch auch gerne Hinweise an, wie ich die beiden Algos weiter optimieren kann (das setzen der capazity bei der Liste bringt wirklich was - beim Array jedoch eher nicht)!


Delphi-Quellcode:
function doArray: integer;
var
  arr: array of String[50];
  f: textfile;
  i: integer;
  tmpStr: string[50];
begin
  Assignfile(f, path);
  reset(f);
  setlength(arr,500000);
// setlength(arr,0);
  i:=0;
  while not eof(f) do
    begin
// setlength(arr,length(arr)+1);
      readln(f,arr[i]);
      inc(i);
    end;
  setlength(arr,i);
  CloseFile(f);
  i:=0;
  while not (arr[i] = 'Ballack') do
    inc(i);
  result:=i;
  setlength(arr,0);
  tmpstr:='';
end;


function doList: integer;
var
  list: TSTringList;
begin
  list:=TSTringList.create;
  list.Capacity:=500000;
  list.LoadFromFile(path);
  result:=list.IndexOf('Ballack');
  FreeAndNil(list);
end;

var
  time: integer;
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
{  time:=GetTickCount;
  writeln(IntToStr(doArray));
  writeln(IntToStr(GetTickCount-time));}

  time:=GetTickCount;
  writeln(IntToStr(doList));
  writeln(IntToStr(GetTickCount-time));
  readln;
end.
Malte
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#23

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 28. Nov 2005, 12:18
Hallo Malte,

in diesem thread wird eine technische Umsetzung für ein ungenau beschriebenes abstraktes Problem diskutiert. Bessere Ergebnisse erhältst du, wenn du das dahinter stehende Anwendungsproblem skizzierst. Ein erfahrener Programmierer wird dann die passende Abstraktion wählen und dir einen optimalen Implementierungsvorschlag machen. Die Anforderungen, die du hier bröckchenweise einreichst, scheinen mir eher der Verschleierung zu dienen. Handelt es sich denn um ein Geheimprojekt?

Auf jeden Fall scheint deine Textdatei keine optimale Repräsentation der Daten zu sein. Wenn das Datenformat fremdbestimmt ist, dann würde ich mir zumindest für die interne Datenhaltung eine clevere Struktur zurechtlegen. Wenn du Syntax und Semantik für deine Textdateien angeben kannst, dann tue es bitte. Und auch die Operationen auf diesen Textdaten musst du hinreichend beschreiben.

Die Qualität der Problembeschreibung hat einen wesentlichen Einfluß auf die der Hilfestellung.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#24

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 28. Nov 2005, 12:48
Ich gebe zu, das ich nicht den ganzen Thread gelesen habe. Aber ich denke, das es Arbeitsspeicher (und Rechenzeit) spart, wenn du die Datei als TFileStream öffnest und in diesem Stream nach der gewünschten Bytefolge suchst.

... und ich denke Marabu hat recht.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#25

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 28. Nov 2005, 13:05
Okay, also nochmal von vorne:
Es handelt sich nicht um ein Geheimobjekt

Es geht mir darum, aus den Datenbankdateien eines Spiels (hier der FussballManager von EA) bestimmte Informationen herauszusuchen, zu ersetzen, etc. Da ich verschiedenste Anwendungsbereiche im Auge habe, möchte ich eine möglichst allgemeingehaltene Lösung, auch wenn diese evtl. für diverse Anforderungsbereiche nicht immer optimal die Anforderungskritierein erfüllen.
Die Datenbank-Dateien sind ganz normale Textdateien, die die verschiedensten Daten eines Landes (Spieler(-name, alter, -etc), Mannschafts(-name,-farbe,-etc)) getrennt durch Zeilenumbrüche enthalten. Zudem existiert eine Indexauteilung durch Zeilen der Sytax "%index%playerX" u.ä., die dem Spieleigenen Editor zum Einlesen dienen, mir jedoch auch manchmal bei der Suche behilflich sind.

Die Operationen, die ich gerne ausführen möchte sind
a) ganz simpel einfach die Daten durchgehen und bestimmte Informationen abgreifen (auslagern, etc.)
b) die Daten durchgehen, bestimmte Dinge auslagern und hierauf basierend in der Quelldatei wieder andere Daten (Zeilen) ändern

Ganz wichtig ist halt, dass die Quelldatei logischerweise in ihrem nativen Format bestehen bleiben muss, damit der spieleigene Editor sie weiterhin einlesen kann. Zudem ist es sicherlich sinnvoll zu erwähnen, dass die Schreibvorgänge nicht immer nur vor oder direkt hinter dem Dateizeiger stattfinden, sondern auch gerne mal genau 67 Zeilen vorher o.ä.



Ich hoffe, dass diese Beschreibung mehr bringt und ihr evtl. noch was spezielles vorschlagen kann. Ansonsten dürfte ein array meine Anforderungen eigtl. erfüllen.
Bei dem TFileStream ist das Problem, das ich persönlich sehe, dass man den gesamten nachfolgenden Text um die Anzahl der Zeichen verschieben muss, die man in einer Zeile einfügt.


Nochwas zum Umfang der Operationen:
Die einzelnen DB-Dateien (diese im Textformat) haben einen Umfang von 2KB und 300 Zeilen bis zu 3,6MB und 600000 Zeilen
und es kann passieren, dass ich verteilt auf 206 Dateien bei mehr als 100.000 Spielerabschnitten jeweils 2-3 Datenzeilen auslesen/ändern muss/möchte.
Malte
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#26

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 28. Nov 2005, 21:07
Unter Syntax verstehe ich eine EBNF oder eine vergleichbare Notation, aber lass nur...

Du willst z.B. Spielerprofile in der Textdatenbank aktualisieren und wenn du einen Spieler hinzufügst oder entfernst, dann musst du die bereits überlesenen internen Verwaltungsinformationen, wie z.B. die Größenangabe für die Spieler-Liste, korrigieren - sehe ich das richtig?

Ich vermute, dass EA einen Editor für solche Zwecke anbietet. Dieser wird das so handhaben, wie ich bereits vorgeschlagen habe: er wird eine intelligente interne Speicherstruktur verwenden, die im Wesentlichen den Speicherbedarf minimieren und die Manipulation vereinfachen sollte. Wenn du den Aufbau der Textdatenbank kennst, dann solltest auch du in der Lage sein eine entsprechende Speicherstruktur zu entwerfen.

marabu
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#27

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 29. Nov 2005, 16:15
Hi,
die Dinge, die ich mit meinem Programm mache, deckt der EA-Editor nicht ab - deshalb schreib ich mir ja nen Programm
Geht größtenteils um automatisierungsprozesse ... das hinzufügen/erstellen von Spielerdaten lässt sich mit dem Edi wesentlih einfacher gestalten, da hast du zweifelsohne Recht.

Da ich aber nur ca. 5% (wenn überhaupt) der zur Verfügung stehendes Daten eines Spielers "zu Rate" ziehe, ist die Frage, ob es sich lohnt, sämtliche Daten einzulesen und zwischenzuspeichern. So wie ich dich verstanden habe soll ich mir ja ne interne Speicherstruktur anlegen, alle Daten dareinlesen und diese dann durchsuchen.


hmmm ... das wäre natürlich ziemlich viel Aufwand, diese Speicherstruktur anzulegen, auch wenn damit dann recht viel möglich wäre.
Eigentlich wollte ich ja nur möglichst fix, die Dateien durchscannen und mir net gleich ne komplett eigene Datenbank im SPeicher anlegen
Malte
  Mit Zitat antworten Zitat
axelf98

Registriert seit: 27. Aug 2003
Ort: Ennepetal
440 Beiträge
 
Delphi 2005 Personal
 
#28

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 29. Nov 2005, 16:37
Falls du es nicht schon weißt:
Bei TStringlist hilft es, wenn man vor dem Durchlaufen und Schreiben ein

MeineListe.BeginUpdate; und zum Schluss

MeineListe.EndUpdate; schreibt...
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#29

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 1. Dez 2005, 18:06
hab ich mal tickmäßig durchgecheckt, hat irgendwie nicht wirklich was gebracht .... hab im Netz allerdings gelesen, dass es was bei sichtbaren objekten, die auf tstrings zurückgreifen halt was brinbgen soll, weil er in de rzeit wohl net updated (das sichtbare) o.ä.
Trotzem danke, ich lern gern neues dazu ...


deshalb auch an marabu und chaobsen die frage, ob von euch noch was kommt ...
Malte
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#30

Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,

  Alt 1. Dez 2005, 19:08
Hallo Malte.

Solange ich keine Syntax-Beschreibung von der text database habe, kann ich den Aufwand für das Design einer optimierten internen Speicherstruktur nicht abschätzen. Ich bleibe aber bei meiner Einschätzung, dass die Struktur nicht zu komplex sein kann - bis du mich eines besseren belehrst.

Vorweihnachtliche Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 09:46 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