AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Strings extrem schnell speichern und laden
Thema durchsuchen
Ansicht
Themen-Optionen

Strings extrem schnell speichern und laden

Ein Thema von Prototypjack · begonnen am 12. Nov 2008 · letzter Beitrag vom 13. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 19:57
Moin,

Ich habe hier mal wieder ein Problem:

Wie kann ich eine Reihe an Strings möglichst schnell aus einer Datei laden (das Speichern muss nicht ganz so schnell erfolgen)? Ist ein binäres Dateiformat der beste Weg? Für mich kommen auch keine Third-Party-Libraries bzw. Dlls und dergleichen in Frage.

Weitere Informationen:
  • Die Strings müssen einen frei setzbaren Identifier besitzen können.
  • Die Länge ist unbekannt.
  • Datengröße der Chars ist 16bit (Unicode)
  • Ich kann keine Stringlists und dergleichen benutzen, da ich die Strings immer einzeln laden muss und die Datei dann wahrscheinlich (um Arbeitsspeicher zu sparen) nicht ständig im RAM liegt. Das heißt: Ich muss extrem speichereffizient und schnell Arbeiten.

Welche Methode könnt ihr empfehlen?

Danke & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 20:20
Ich würde an den Anfang der Datei eine einfache Tabelle schreiben, die jedem Stringbezeichner den Offset innerhalb der Datei und die Länge des Strings zuordnet. Daraus kannst du dann eine Hashmap erstellen, die du ständig im RAM hast. Wenn du jetzt einen String laden willst, schaust du in deiner Hashtabelle nach, suchst den passenden Offset und liest einen String der gefundenen Länge aus. Wenn du nicht "vorhersehen" kannst, ob du auch noch andere Strings aus der Gegend brauchen kannst, dürfte es nicht schneller gehen.

Bei Andorra ist glaube ich ein gepufferter Dateistream dabei, der vor allem bei großen Dateien extrem schnell ist - wie es mit Speicherverbrauch aussieht, weiß ich nicht genau.

Wie groß sind denn deine Dateien, dass du dir um Speicherverbrauch sorgen machst? Eine sinnvolle Alternative zu diesem doch recht umständlichen Vorgehen wäre eine Datenbank, die Dinger sind extrem schnell und fressen auch nicht so viel Speicher - das wäre meine Lösung, wenn es wirklich um große Datenmengen geht.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:04
Moin,

Die Datenmengen sind in der Regel klein (höchstens ein paar Megabyte). Ich will lediglich so schnell (!) und so schonend wie möglich arbeiten.

Das mit der Hashmap habe ich jedoch nicht wirklich verstanden, wie genau meinst du das? Achja: Habt ihr vielleicht noch weitere Literatur wie man solche Dateiformate am besten aufbaut (ich habe sowas bisher noch nie gemacht)?

Danke & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:09
Zitat von Prototypjack:
Die Datenmengen sind in der Regel klein (höchstens ein paar Megabyte). Ich will lediglich so schnell (!) und so schonend wie möglich arbeiten.
Es würde (mir zumindest) helfen, wenn Du kurz umschreiben könntest was das für Daten sind. Für mich liest sich das so als würdest Du versuchen den Unix Befehl string zu implementieren um aus einer beliebigen Binärdatei alle lesbaren Zeichen zu extrahieren. Allerdings fragst Du ja auch nach einem Dateiformat. Von daher würd das irgendwie nicht passen. Vielleicht stell ich mich auch einfach nur zu dumm an .
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:16
Zitat von Prototypjack:
Das mit der Hashmap habe ich jedoch nicht wirklich verstanden, wie genau meinst du das?
Wnn man davon ausgeht, daß die Identifier Strings sind, dann wird eine Liste mit jeweils dem Hash des Identifier und der Text-Position in der Datei erstellt.

Ein Hash (z.B. als Interger) läßt sich schneller suchen/vergleichen, als ein ganzer String.

und beim Suchen in soeiner Liste wird dann sozusagen erstmal aus dem Such-Identifier ein Hash erstellt und dieser dann schön schnell gesucht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:34
Der Hash-Wert wird dabei jedoch als Index verwendet, um die Suche noch weiter zu optimieren. Hier von einer 'Liste' zu sprechen, ist falsch. Eine Hashmap ist eine extrem effiziente Datenstruktur zum speichern und finden von Name/Value-Paaren. Näheres hier im Wiki..

Ich würde doch RAM spendieren, um einen MRU-Cache vorzuschalten. Dann werden oft benötigte Strings im Speicher gehalten, der Zugriff geht dann noch wesentlich schneller.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:36
Wenn es nur ein paar Megabyte sind, kannst du die Dinger problemlos komplett im Speicher ablegen.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:42
Zitat von 3_of_8:
Wenn es nur ein paar Megabyte sind, kannst du die Dinger problemlos komplett im Speicher ablegen.
Ich meine aus seiner Aussage im Eröffnungsthread [nein ... ist #3] herauszulesen, dass die Größe der Dateien im Laufe der Zeit auch stark anwachsen kann, und da will er halt vorbeugend eine vernünftige Lösung haben.

Denn Vorbeugen ist besser als auf die Schuhe

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:44
@3_of_8: Das habe ich mich noch nicht mal getraut, zu erwähnen.
@Rufo: Deshalb ein Cache.

Bei der Dateistruktur ist es allerdings nicht trivial, denn wenn man 3_of_8's Vorschlag aufgreift, müsste man die komplette Datei jeweils neu schreiben, und das wäre etwas unperformant.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Strings extrem schnell speichern und laden

  Alt 12. Nov 2008, 21:51
Wie sieht es hier eigentlich mit MMFs aus? Gibt es da Performance-Einbußen gegenüber normalem Datei-IO? Das Problem mit dem Schreiben wäre damit zumindest gelöst, wenn man sich eine vernünftige Datenstruktur ausdenkt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:17 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