按需打开自定义文件

时间:2009-07-29 14:37:07

标签: winapi memory-mapped-files

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

目前,每当我想要与文件进行交互时,我必须预先加载并解析整个事物,否则只选择我需要的部分并加载它们。

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

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

这种事情有没有标准模式?看来我的选择是:

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

2 个答案:

答案 0 :(得分:1)

如果可能的话,如果你有一个随机访问模式, MMAP整个文件通常是最简单的事情。这样你就可以将加载/卸载问题委托给操作系统,你有1& 2免费。

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

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

答案 1 :(得分:1)

如果文件相对较小,则整个文件的映射就足够了。如果文件很大,您可以打开mmap视图,只需在文件中移动它并调整大小以便在需要时查看每个部分。