AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesucht

Ein Thema von hackyie · begonnen am 13. Aug 2006 · letzter Beitrag vom 14. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#1

eigenes Dateiformat, Effizienz erhöhen, Denkanstöße gesucht

  Alt 13. Aug 2006, 23:18
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?
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 13. Aug 2006, 23:24
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

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

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

  Alt 14. Aug 2006, 06:25
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 14. Aug 2006, 06:45
Man könnte aber auch die Frage stellen, warum ein eigenes Format nötig ist?
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 14. Aug 2006, 08:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 14. Aug 2006, 09:08
Hi!

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

---
Daten

Frank
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 14. Aug 2006, 09:35
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
  Mit Zitat antworten Zitat
hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#8

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

  Alt 14. Aug 2006, 09:36
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?
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#9

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

  Alt 14. Aug 2006, 09:37
Zitat von bernau:
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.
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

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

  Alt 14. Aug 2006, 09:53
Schau dir mal mein Virtuelles Dateisystem in der Codelib an
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  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 08:39 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