我有一个自定义文件类型,它在部分中实现,标题显示文件中每个部分的偏移量和长度。
目前,每当我想与文件交互时,我必须预先加载和解析整个内容,或者只选择我需要的部分并仅加载它们。
我想做的是实现一种混合方法,其中每个部分都按需加载。
然而,这样做似乎有很多潜在的缺点,因为文件系统句柄打开的时间比我想要的要长,而且我会产生额外的代码复杂性。
这种事情有什么标准模式吗?看来我的选择是:
- 只需加载整个文件并停止抱怨循环/内存浪费
- 将整个文件作为原始字节加载到内存中,然后从内存缓冲区而不是磁盘满足对卸载部分的任何请求。这节省了我解析不需要的部分的成本并且需要更少的内存(因为磁盘表示比它周围的对象模型更紧凑),但仍然意味着我浪费了我永远不会加载的部分的内存。
- 立即加载我需要的任何部分并关闭文件,但保留文件的源位置。然后,如果请求另一个部分,请重新打开文件并加载数据。在这种情况下,如果基础文件被更改,我可能会得到奇怪的结果。
- 与上述相同,但保持文件句柄打开(可能允许读取共享)。
- 使用 Memory-Mapped IO 加载文件并打开文件的视图。
有什么想法吗