2010-05-07 65 views
1

我们有一个简单的二进制文件格式用于在我们的应用程序(C#.NET Windows App)中缓存数据。格式基本上是一个简短的短语,表示对象类型,后面跟着对象id的guid(字符串),然后是任何对象特定的数据(字符串整数)。我们希望能够在同一个文件(> 10000)中存储多个对象,但在某些情况下只能按需加载。我们的解决方案是保留文件中对象位置的索引 - 因此,当我们开始编写新对象时,我们会记录对象开始的文件流中的位置。当我们想要加载这个对象时,我们使用这个索引位置来加载相关数据。这工作正常。加载压缩文件流的特定部分

但是,如果我们要压缩文件,这种方法仍然有可能吗?我对压缩的工作方式不是太热,特别是我们打算使用的GZipStream类(System.IO.Compression)。据我所知,这个类不支持Seeking或Position属性。仍然有可能使用底层FileStream的搜索和位置(我猜不是)?基本上,是否有可能有一个压缩文件,我们可以选择加载,如果是的话,我们该怎么做?

感谢,

史蒂夫

回答

1

不,如果您要访问的非压缩数据中的特定位置,你将不得不解压缩它,至少暂时

0

这是不是一个真正的寻求,但解决方案将是:

  • 保持您的位置在文件中的轨道(可能通过实施从BinaryReader继承的“myBinaryReader”最好)
  • 如果您正在从当前位置向前寻找位置 - ReadBytes,直到您到达那里。
  • 如果您在当前位置之前寻找位置 - 重新打开解压缩读取文件(将当前位置重置为零),然后ReadBytes,直到您到达想要的位置。

显然这并不是理想的解决方案,但它仍然可以提供可接受的性能。 在我的情况下,压缩文件很容易适应内存(未压缩不),所以我已经将压缩文件加载到内存中。

理想情况下,底层deflate类将被更改为支持真正的Seeks。

0

一个更好的解决方案:

使用GZipStream创建内存中的压缩字节,然后写自己的类来控制这个磁盘缓存和写(不使用DeflateStream)。另外编写你自己的类来从磁盘读取这些数据。

然后您可以确保底层磁盘流支持Seeks。