3

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

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

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

如果数据被大量访问然后处理掉,视图可能会在内存中保留一段时间

一种可能很幼稚的方法是按偏移量对要获取的对象进行排序,然后简单地为每个带有小缓冲区的偏移量调用 CreateViewAccessor。另一种方法是尝试找出所需的不同 MemoryMappedViewAccessor 的最少数量及其大小。但我不确定创建 CreateViewAccessor 的开销以及一次可以安全访问多少空间。我可以做一些测试,但如果有人有更好的主意...... :)

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

4

2 回答 2

0

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

于 2010-10-24T15:29:31.693 回答
0

What kind of storage is the file on? A normal HDD or a SSD? In case of a normal hdd you should minimize seek times, so you might need to order your accesses by the offset.

I think having large memory mapped segments doesn't cost much RAM. They only cost address space since they can be backed by the file itself. So the most of the used RAM is the OS cache.

From what I heard async IO using I/O Completion Ports is fastest, but I haven't used them myself yet.

于 2010-10-24T14:43:47.477 回答