Objective c 是否可以对压缩文件进行内存映射?

Objective c 是否可以对压缩文件进行内存映射?,objective-c,mmap,Objective C,Mmap,我们有zlib压缩二进制数据的大文件,我们希望将其映射到内存中 甚至可以对这样一个压缩的二进制文件进行内存映射,并以有效的方式访问这些字节吗 我们是否最好只是解压缩数据,内存映射数据,然后在完成操作后再次压缩数据 编辑 我想我应该提到的是,这些文件可以定期追加 目前,磁盘上的这些数据通过NSMutableData加载并解压缩。然后,我们对这些数据执行一些任意的读/写操作。最后,在某个时刻,我们压缩数据并将其写回磁盘。内存映射就是内存到磁盘的1:1映射。这与自动解压缩不兼容,因为它破坏了1:1映射

我们有zlib压缩二进制数据的大文件,我们希望将其映射到内存中

甚至可以对这样一个压缩的二进制文件进行内存映射,并以有效的方式访问这些字节吗

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

编辑

我想我应该提到的是,这些文件可以定期追加


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

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

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

我相信这是一个可以解决的问题,但这不是一个微不足道的问题,您需要了解压缩格式。我不知道有什么易于重用的软件可以解决这个问题(尽管我相信过去很多人都解决过类似的问题)

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

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

显然,您希望缓存您的解决方案
NSCache
NSPurgeableData
是这方面的理想选择。要做到这一点并保持良好的绩效将是一项挑战,但是,如果它是应用程序的关键部分,那么它可能非常有价值。

我编辑了我的问题……事实上,我们确实会在某个时候更新这些压缩数据……所以听起来我们想要做的似乎是不切实际的?没有实际的方法对gzip数据进行任意读/写。你可以追加(上面的方法仍然适用于追加),但是你不能修改中间的东西。