所以场景如下:我有一个 2-3 GB 的二进制序列化对象的大文件,我还有一个索引文件,其中包含每个对象的 id 及其在文件中的偏移量。
我需要编写一个给定一组 id 的方法,将它们反序列化到内存中。性能是最重要的基准,保持合理的内存要求是第二个。
使用 MemoryMappedFile 似乎是要走的路,但是我有点不确定如何处理大文件。我无法为整个文件创建 MemoryMappedViewAccessor,因为它太大了。我可以同时打开几个不同段的 MemoryMappedViewAccessor,而不会对内存造成太大影响,在这种情况下,这些段应该有多大?
如果数据被大量访问然后处理掉,视图可能会在内存中保留一段时间
一种可能很幼稚的方法是按偏移量对要获取的对象进行排序,然后简单地为每个带有小缓冲区的偏移量调用 CreateViewAccessor。另一种方法是尝试找出所需的不同 MemoryMappedViewAccessor 的最少数量及其大小。但我不确定创建 CreateViewAccessor 的开销以及一次可以安全访问多少空间。我可以做一些测试,但如果有人有更好的主意...... :)
我想另一种方法是将大数据文件分成几个,但我不确定在这种情况下会有什么好处......