从巨大的二进制文件反序列化对象的最快方法

时间:2010-10-24 14:36:08

标签: .net file-io binaryfiles memory-mapped-files

所以场景如下:我有一个2-3 gb的二进制序列化对象的大文件,我还有一个索引文件,其中包含每个对象的id及其在文件中的偏移量。

我需要编写一个方法,给出一组id将它们反序列化到内存中。性能是最重要的基准,第二是保持内存要求合理。

使用MemoryMappedFile似乎是要走的路,但我对如何处理大文件有点不确定。我不能为整个文件创建一个MemoryMappedViewAccessor,因为它太大了。我可以同时打开几个不同段的MemoryMappedViewAccessor,而不会过多地影响内存,在这种情况下,这些段应该有多大?

如果对数据进行了大量访问然后将其丢弃,那么视图可能会在内存中保留一段时间

一种可能天真的方法是命令通过偏移获取对象,并使用小缓冲区为每个偏移调用CreateViewAccessor。另一种方法是尝试找出所需的最少量的MemoryMappedViewAccessor及其大小..但我不确定创建CreateViewAccessor的开销以及可以一次安全访问多少空间。我可以做一些测试,但如果有人有更好的想法......:)

我想另一种方法是将大数据文件拆分成几个,但我不确定在这种情况下会有什么好处...

2 个答案:

答案 0 :(得分:0)

该文件是什么类型的存储?普通硬盘还是SSD?在普通硬盘的情况下,您应该尽量减少寻道时间,因此您可能需要通过偏移来订购您的访问。

我认为拥有大内存映射段不会占用太多RAM。它们只占用地址空间,因为它们可以由文件本身支持。因此,大多数使用的RAM都是操作系统缓存。

据我所知,使用I/O Completion Ports的异步IO速度最快,但我还没有自己使用它们。

答案 1 :(得分:0)

我的问题是你为什么要有2个3GB的序列化对象文件?加载这个问题总是会出现性能问题 您真的需要立即处理所有这些信息吗?最好的方法可能是某种类型的数据库,您可以使用它来查询所需的元素,并在需要时重建它们。 您能否提供有关您存储的数据类型以及使用方式的更多信息。在我看来,你的设计需要一点工作。