【问题标题】:Opening a custom file on-demand按需打开自定义文件
【发布时间】:2011-11-18 01:14:52
【问题描述】:

我有一个自定义文件类型,它在部分中实现,标题显示文件中每个部分的偏移量和长度。

目前,每当我想与文件交互时,我必须预先加载并解析整个内容,或者只选择我需要的部分并仅加载它们。

我想做的是实现一种混合方法,其中每个部分都按需加载。

然而,这样做似乎有很多潜在的缺点,因为文件系统句柄打开的时间比我想要的要长,而且我会产生额外的代码复杂性。

这类事情有什么标准模式吗?看来我的选择是:

  1. 只需加载整个文件,不要再抱怨循环/内存浪费了
  2. 将整个文件作为原始字节加载到内存中,然后从内存缓冲区而不是磁盘满足对卸载部分的任何请求。这节省了我解析不需要的部分的成本并且需要更少的内存(因为磁盘表示比它周围的对象模型更紧凑),但仍然意味着我浪费了我永远不会加载的部分的内存。
  3. 立即加载我需要的任何部分并关闭文件,但保留文件的源位置。然后,如果请求另一个部分,请重新打开文件并加载数据。在这种情况下,如果基础文件发生更改,我可能会得到奇怪的结果。
  4. 与上述相同,但文件句柄保持打开状态(可能允许读取共享)。
  5. 使用 Memory-Mapped IO 加载文件并保持打开文件的视图。

任何想法

【问题讨论】:

    标签: winapi memory-mapped-files


    【解决方案1】:

    如果可能,MMAP-ing 整个文件通常是最容易做的事情,如果你有一个随机访问模式。这样,您只需将加载/卸载问题委托给操作系统,您就可以免费获得 1 和 2。

    如果你有非常特殊的访问模式,你甚至可以使用类似 fadvise() 的东西(我不是 Win32 的确切等价物)来告诉操作系统你的访问意图。

    如果您的文件超过 2GB,您可以使用 64 位方式或按需使用 mmap() 文件。

    【讨论】:

      【解决方案2】:

      如果文件比较小,映射整个文件就足够了。如果文件很大,您可以打开一个 mmap 视图,然后在文件周围移动它并调整其大小以在需要时查看每个部分。

      【讨论】:

      • 移动它,我不知道这个技巧。你有一些信息可以驯服我的好奇心吗? :-)
      • 好吧,从技术上讲,您不能移动现有视图。但是您可以取消映射旧视图并在同一 mmap 的不同部分重新映射新视图。您甚至可以同时激活同一个 mmap 的多个视图。我使用这种技术来滚动浏览数兆字节(有时是数千兆字节)的日志文件的数据,而且效果非常好,速度非常快。
      猜你喜欢
      • 2015-07-13
      • 2015-07-19
      • 1970-01-01
      • 2011-03-13
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多