使用硬盘扩展大阵列

时间:2014-07-29 19:38:00

标签: c# arrays memory-management garbage-collection hard-drive

由于科学原因,我解决了九个男人的莫里斯游戏。我试图保存有关某些游戏状态的信息。不幸的是,我达到了我的记忆限制。

我的阵列非常庞大。当新元素出现时,我需要扩展这些数组。我有足够的内存来存储这些数组,但我不能创建扩展数组,其中原始数组仍在内存中。

我考虑过将原始数组保存到某个文件中,将其从内存中删除,创建扩展数组并从文件中加载数据。

有没有快速的方法来保存数组大小N并将其作为第一个N元素加载到更长的数组?到目前为止我使用的是BinaryFormatter,但我不知道我是否可以在这里使用它。

如何告诉GC从内存中删除原始数组?

1 个答案:

答案 0 :(得分:3)

您是否已调查始终将数组存储在文件中并使用该文件的可能性?

现在,您可以使用Memory-Mapped Files在C#(以及Win API)中执行此操作。基本上,这允许您映射一个内存缓冲区,可以访问非常大的文件的应用程序部分,并对它们进行读/写。在我发布的链接中有一个明显的例子,它显示了基本知识以及如何导航"通过非常大的文件在内存中查看。

在您的情况下,您想要定义自己的文件格式(没什么特别的),并决定如何在文件中分离这些数组。可能你会想要一个包含元数据的标题(多少个数组,它们的偏移量等)和一个内容部分,至少分成多个部分。

我认为这是一种更直接的处理方式,而不是交换内存中的内容+每次都要担心GC。