Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesucht (https://www.delphipraxis.net/75072-eigenes-dateiformat-effizienz-erhoehen-denkanstoesse-gesucht.html)

hackyie 13. Aug 2006 22:18


eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesucht
 
Ich bräuchte mal ein paar gedanken von Leuten, die das vielleicht sogar selbst schon mal gemacht haben. Es geht um das uralte Ding ein eigenes Archivformat (ohne Kompression) zu erstellen, so dass ich mehrere Dateien in einer Datei speichern und einzeln wieder herauslesen kann. Ich habe die Unit fertig und sie läuft auch, nur die Performance ist etwas am Boden ^^

Mein jetziges Dateiformat:
  • Anzahl Dateien
  • Dateiname 1
  • Dateiname 2
  • Dateiname n
  • Dateigröße 1
  • Dateigröße 2
  • Dateigröße n
  • Offset 1
  • Offset 2
  • Offset n
  • Datei-Inhalt 1
  • Datei-Inhalt 2
  • Datei-Inhalt n

Problem ist klar, wenn ich eine von 11.000 Dateien haben will, muss ich den kompletten Header auslesen (30.000 Lesevorgänge), um mir dann aus den Arrays den richtigen Offset zum richtigen Namen zu suchen und dann erst zum Offset zu springen.

Wie mache ich das besser? Ich könnte das ganze Blockweise schreiben also [Anzahl][Name1][Größe1][Offset1]... Dann bleibt aber das Problem, dass ich auch (fast) alles auslesen muss, weil die Namen ja strings sind und somit die Blöcke nie gleich groß. Und wenn ich Strings fester Länge nehme habe ich das Problem gelöst, verschwende aber Speicherplatz. Weitere Ideen?

SirThornberry 13. Aug 2006 22:24

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Du könntest die Namen alphabetisch sortieren vor die Namen die Offsets packen wo die Namen stehen.
dann kannst du dank der Sortierung mit einem Quicksortalgo den Namen recht schnell finden. Also zuerst den Dateinamen auf den das erste Offset zeigt mit dem Dateinamen des letzten Offsets vergleichen etc...
Du kannst es auch lassen wie es jetzt ist und den gesamten Header einlesen. Wenn der gesamte Header von 11000 Dateien im Speicher ist, sollte das doch recht schnell gehen. Ich weiß ja auch nicht wie dein header aussieht. Hoffentlich nicht mit Delimiter sondern mit Angabe wie lang der folgende String/Dateiname ist.

chaosben 14. Aug 2006 05:25

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Der Knackpunkt ist wohl der Ausgangspunkt der Suche:

->Hast du einen Namen und suchst die Datei dazu? Dann siehe SirThornberry.
->Hast du einen Dateiindex und suchst die Datei dazu? Dann reicht es wenn du im Header nur die Offsets der Dateien speicherst und jeder Datei einen eigenen Header gibst.
->Willst du erstmal alle Dateinamen herausfinden? Dann musst du ob wohl oder übel alle Header durchgehen.

mkinzler 14. Aug 2006 05:45

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Man könnte aber auch die Frage stellen, warum ein eigenes Format nötig ist?

Hawkeye219 14. Aug 2006 07:57

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Hallo hackyie,

ich würde wahrscheinlich folgenden Aufbau wählen:

Code:
* Info-Block
  - Größe der Directory in Byte
  - Anzahl Einträge
* Directory
  - je Eintrag
    - Offset (+ evtl. Länge) des Namens im Header
    - Offset des Dateiinhalts
    - Größe der Datei
  - alle Dateinamen
* Daten
  - alle Dateiinhalte
Zum Einlesen holst du zunächst den Info-Block (Größe der Directory und Anzahl der Einträge) aus der Archivdatei. Anschließend kannst du mit einem Lesebefehl die komplette Directory einlesen und im Speicher durchsuchen. Alle Einträge sind gleich lang, weil nicht der Dateinamen selbst, sondern nur ein Verweis darauf im Eintrag abgelegt wird. Wenn du die Directory alphabetisch sortiert abspeicherst, kann eine Datei mittels binärer Suche relativ schnell gefunden werden.

Gruß Hawkeye

Mavarik 14. Aug 2006 08:08

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Hi!

Anzahl Direinträge
CRC32 des Filesnames
Seek auf Datei
---
Dir 2
Dateiname
Seek auf Datei

---
Daten

Frank

bernau 14. Aug 2006 08:35

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Zitat:

Zitat von hackyie
Wie mache ich das besser? ..... Weitere Ideen?

Ist jetzt keine direkte Antwort auf deine Frage. Aber du hast ja um weitere Ideen gebeten.

Ich würde mit einer ZIP-Komponente eine ZIP-Datei ertellen.

Z.B. VCLZIP

Damit bin ich bis jetzt gut gefahren. Man kann noch nach Jahren auf das Archiv zugreifen, denn du kannst davon ausgehen, dass das Format noch Jahre lang exestiert. Ein eigenes Format beinhaltet immer das Risiko, daß man für die Archive auch die entsprechende Software für den Zugriff auf die Archive bereitstellen/pflegen muss.

Netter Nebeneffekt ist die Komprimierung.



Gerd

hackyie 14. Aug 2006 08:36

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
danke für die Anregungen...an das im Speicher lassen des Headers habe ich gar nicht gedacht... bisher rufe ich halt 11.000 mal myFileUtils.loadFile(...) auf und dann wird jedesmal neu der header ausgelesen.

Alternativ finde ich die Idee mit dem crc nicht schlecht...daraus lässt sich auch was machen. Werd gleich mal suchen...gibts hier im Board irgendwo infos dazu, wie man checksummen errechnet?

hackyie 14. Aug 2006 08:37

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Zitat:

Zitat von bernau
Zitat:

Zitat von hackyie
Wie mache ich das besser? ..... Weitere Ideen?

Ist jetzt keine direkte Antwort auf deine Frage. Aber du hast ja um weitere Ideen gebeten.

Ich würde mit einer ZIP-Komponente eine ZIP-Datei ertellen.

Z.B. VCLZIP

Damit bin ich bis jetzt gut gefahren. Man kann noch nach Jahren auf das Archiv zugreifen, denn du kannst davon ausgehen, dass das Format noch Jahre lang exestiert. Ein eigenes Format beinhaltet immer das Risiko, daß man für die Archive auch die entsprechende Software für den Zugriff auf die Archive bereitstellen/pflegen muss.

Netter Nebeneffekt ist die Komprimierung.



Gerd

Mein Problem ist, dass ich sauschnell teilweise hunderte Bilder auslesen muss, das geht mit Zip sicher zu langsam, oder? Ich brauche das Teil für eine Art Bildbetrachter, da muss bei jeder Markierungsaktion und jedem refresh des Browsers jedes Bild neu eingelesen werden.

franktron 14. Aug 2006 08:53

Re: eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesu
 
Schau dir mal mein Virtuelles Dateisystem in der Codelib an


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 1 von 2  1 2      

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