Frage

Wir haben ein einfaches binäres Dateiformat für Daten in unserer Anwendung (C # .NET-Windows-App) Caching. Das Format ist im Grunde eine kurze, die den Objekttyp durch eine GUID (string) für das Objekt-ID gefolgt zeigt dann alle objektspezifischen Daten (Strings Ints was auch immer). Wir wollen viele Objekte in der gleichen Datei (> 10000), aber in bestimmten Situationen nur bei Bedarf laden speichern können. Die Lösung, die wir haben, ist ein Index der Objektpositionen innerhalb der Datei zu halten - so, wenn wir ein neues Objekt Schreiben beginnen wir das Objekt beginnt, die Position in der Datei-Stream aufzeichnen. Wenn wir dieses Objekt laden möchten, verwenden wir diese indizierten Stelle die relavent Daten zu laden. Dies funktioniert gut.

Wenn wir jedoch die Datei komprimieren möchten, wird diese Methode immer noch möglich sein? Ich bin nicht zu heiß, wie Kompression arbeitet und speziell die GZipStream Klasse (System.IO.Compression), dass wir den Einsatz planen. Wie ich es verstehe, ist diese Klasse nicht Sucht oder die Eigenschaft Position unterstützen. Wird es nach wie vor möglich sein, die Suche und Position des zugrunde liegenden Filestream zu verwenden (ich vermute nicht)? Grundsätzlich ist es möglich, eine komprimierte Datei zu haben, dass wir selektiv aus laden können, wenn ja, wie wir es tun?

Danke,

Steve

War es hilfreich?

Lösung

Nein, wenn Sie eine bestimmte Position in den unkomprimierten Daten zugreifen möchten, werden Sie es dekomprimieren müssen, zumindest vorübergehend

Andere Tipps

Dies ist keine echte Sucht, sondern eine Lösung wäre:

  • einen Überblick über Ihre Position in der Datei halten (wahrscheinlich am besten durch einen „myBinaryReader“ Umsetzung, die erbt von Binary)
  • , wenn Sie eine Position nach vorne von der aktuellen Position der Suche nach -. Readbytes, bis Sie dort
  • Wenn Sie eine Position suchen vor Ihrer aktuellen Position -. Öffnen Sie die Datei für einen dekomprimierten Lese (die auf Null Ihrer aktuellen Position zurücksetzt), und dann Readbytes, bis Sie zu erhalten, wo Sie sein möchten

Natürlich ist dies nicht bei allen eine ideale Lösung, aber es kann immer noch eine akzeptable Leistung geben. In meinem Fall die komprimierte Datei passt leicht in dem Speicher (unkomprimiert nicht), so habe ich die komprimierte Datei in den Speicher geladen.

Im Idealfall würde die zugrunde liegende deflate Klasse geändert werden, um zu unterstützen wahre Sucht.

eine bessere Lösung:

Verwendung GZipStream auf komprimiertes Bytes im Speicher zu erstellen und dann Ihre eigene Klasse schreibt die Caching zu steuern und diese auf der Festplatte zu schreiben (nicht DeflateStream verwenden). Auch schreiben Sie Ihre eigene Klasse für das Lesen dieser Daten von der Festplatte.

Sie können dann sicher, die zugrunde liegenden Plattenstrom unterstützt suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top