![]() |
AW: Große strukturierte Textdateien laden - immer langsamer
Wie wäre es mit einer Verwaltungsstruktur am Anfang/Ende der Datei, oder in einer eigenen Datei, welche die Offsets,Länge und den Typ der Objekte beinhaltete. Die Objekte selbst werden dann gezielt per passendem Streamreader/writer geschrieben und gelesen?
|
AW: Große strukturierte Textdateien laden - immer langsamer
Zitat:
Beispiel:
Delphi-Quellcode:
Mit Inc und Zeichenzugriff via MyPtr^ lässt sich das bequem machen. Untypisiert mit dem Typ Pointer macht doch gar keinen Sinn...
var
MyString: String; MyPtr: PChar; begin MyString := 'Hallo Welt'; MyPtr := PChar(MyString); ShowMessage(Copy(MyPtr, 1, 5)); // 'Hallo' Inc(MyPtr, 6); ShowMessage(MyPtr); // 'Welt' end; |
AW: Große strukturierte Textdateien laden - immer langsamer
Zitat:
Nimm da lieber SetString. Zitat:
Menno, ich finde es nicht mehr, aber ich dachte ich hätte mal eine Funktion gesehn (direkt im Delphi), welche einen String nimmt und einem daraus einen PChar erzeugt. Also das GetMem und Move direkt verbaut, wo man dann nicht an Unicode denken muß. |
AW: Große strukturierte Textdateien laden - immer langsamer
Meinst Du
![]() |
AW: Große strukturierte Textdateien laden - immer langsamer
Zitat:
|
AW: Große strukturierte Textdateien laden - immer langsamer
Hmm.... Ok, der Unterschied zwischen O(n) und O(n^2) ist wohl doch Pchar statt String...
Hmmpfrl. |
AW: Große strukturierte Textdateien laden - immer langsamer
Schutz des Programms?
Früher konnte man höchstens Controls aus der DFM entfernen, wenn man die Resourcen der EXE bearbeitet, aber dank CodeBinding kann man glatt die komplette GUI umbauen/erweitern, nur indem man die DFM bearbeitet. Zitat:
Delphi-Quellcode:
:zwinker:
SizeOf(Char)
|
AW: Große strukturierte Textdateien laden - immer langsamer
Zitat:
|
AW: Große strukturierte Textdateien laden - immer langsamer
Hab's gefunden (in falscher Unit gesucht :oops:)
![]() Zitat:
Ich mein eher sowas sie DupStr/StrDup aus C++. Nja, aber StrLCopy (weil ja nicht der ganze String kopiert werden soll), zusammen mit einem GetMem würde sich gut in einer Funktion machen.
Delphi-Quellcode:
function DupStr(str: PAnsiChar; MaxLen: NativeInt = -1): PAnsiChar; override; // MaxLen incl. #0
function DupStr(str: PWideChar; MaxLen: NativeInt = -1): PWideChar; override; function DupStr(str: PAnsiChar; MaxLen: NativeInt = -1): PAnsiChar; begin if MaxLen = 0 then Exit(nil); if MaxLen < 0 then MaxLen = StrLen(str) + 1; Result := GetMemory(MaxLen * SizeOf(str^)); try StrLCopy(Result, str, MaxLen); finally FreeMemory(P); end; end; function DupStr(str: PWideChar; MaxLen: NativeInt = -1): PWideChar; ... ![]() ![]() ![]() DupStr = von PChar/String zu PChar |
AW: Große strukturierte Textdateien laden - immer langsamer
Abend zusammen,
wow, :shock: - da hab ich ja ne Diskussion losgetreten.. Vielen Dank für die vielen Anregungen! Ich versuche mal die Möglichkeiten für eine Optimierung zu sortieren: - Ohne Pointer: soviel POS wie möglich raus, Stringlist möglichst nur einmal durchlaufen, ggf. kleinere Puffer bilden. -> Das war bisher in etwa auch mein Ansatz. Das Problem ist dabei aber die Datencodierung a la 'Quasi'-XML, also mit Anfangs- und Endtag, fortlaufend, Baumstruktur. Bisher habe ich noch nicht mit fertigen XML-Parsern gearbeitet. - Mit Pointern: Vielen Dank für die Code-Bsp. Ich muss aber leider gestehen, dass ich sie nicht wirklich verstehe. Mir ist wohl immer noch nicht die Logik klar, mit der man "Pointer verschieben" kann u.ä. Ohne Pointer, zB bei Strings ist mir klar: Ich kann mit einem Index und einem Count Teile eines Strings kopieren, löschen etc, quasi Intervalle herausschneiden und in einen neuen Topf gegeben und weiterverarbeiten. Wie soll das bei Pointern gehen? Wie kann ich da 'Intervalle' von Daten definieren, wenn ich doch nur mit EINEM Zeiger auf EINEN 'Punkt' (also z.B. eine ganze Variable im Speicher) verweise? Bräuchte ich - für Intervalle wie '234' in '12345' nicht zwei Pointer? Da steh ich aufm Schlauch.. - Streams: Das scheint mir die naheliegendste, weil auch gerade am einfachsten umzusetzende Lösung zu sein. Die Reihenfolge der Datenspeicherung/-ladung ist klar. Ob das dann wirklich schneller wird, weiß ich noch nicht. Muss ich ausprobieren. Es dürften damit aber einige POSes entfallen. Falls noch jemand einen Tipp zum Pointer-Verständnis hat (gerne auch am Bsp. von jaenicke), würde ich mich freuen. Ansonsten nochmal herzliches Dankeschön und einen schönen Sonntagabend wünscht Euch frieder |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 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