内存映射压缩文件是否可能?

时间:2011-09-23 13:25:00

标签: objective-c mmap

我们有大量文件,包含zlib压缩的二进制数据,我们想要内存映射。

甚至可以存储映射这样的压缩二进制文件并以有效的方式访问这些字节吗?

我们最好只是解压缩数据,内存映射它,然后在我们完成操作后再次压缩它?

修改

我想我应该提一下这些文件可以定期附加。

目前,磁盘上的这些数据通过NSMutableData加载并解压缩。然后我们对这些数据进行一些任意的读/写操作。最后,在某些时候我们压缩并将数据写回磁盘。

1 个答案:

答案 0 :(得分:3)

内存映射完全是关于内存到磁盘的1:1映射。这与自动解压缩不兼容,因为它打破了1:1映射。

我认为这些文件是只读的,因为写入压缩文件的随机访问通常是不切实际的。因此我认为这些文件有点静态。

我相信这是一个可以解决的问题,但这并非易事,您需要了解压缩格式。我不知道有任何易于重复使用的软件可以解决它(虽然我相信很多人过去已经解决过这样的问题)。

您可以对内存映射文件,然后提供前端适配器接口以获取给定偏移量和长度的字节。您将扫描文件一次,解压缩,并创建一个“目录”文件,将周期性标称偏移映射到实际偏移(这只是一个优化,您可以在获取数据时“发现”此目录) 。然后算法看起来像:

  • 给定标称偏移量 n ,查找映射到小于 n 的最大实际偏移 m
  • m -32k读入缓冲区(32k是DEFLATE中允许的最大距离)。
  • m 开始DEFLATE算法。计算解压缩的字节,直到到达 n

显然你想要缓存你的解决方案。 NSCacheNSPurgeableData是理想的选择。做得非常好并保持良好的性能将是一项挑战,但如果它是您应用程序的关键部分,那么它将非常有价值。