![]() |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
Zitat:
|
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 :D 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. |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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. :stupid: |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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. |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 :D |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
Falls du es nicht schon weißt:
Bei TStringlist hilft es, wenn man vor dem Durchlaufen und Schreiben ein
Delphi-Quellcode:
und zum Schluss
MeineListe.BeginUpdate;
Delphi-Quellcode:
schreibt...
MeineListe.EndUpdate;
|
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 ... :???: :) |
Re: Lesen, Schreiben und mehr in Textdateien - TFileStream,
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz