由于科学原因,我解决了九个男人的莫里斯游戏。我试图保存有关某些游戏状态的信息。不幸的是,我达到了我的记忆限制。
我的阵列非常庞大。当新元素出现时,我需要扩展这些数组。我有足够的内存来存储这些数组,但我不能创建扩展数组,其中原始数组仍在内存中。
我考虑过将原始数组保存到某个文件中,将其从内存中删除,创建扩展数组并从文件中加载数据。
有没有快速的方法来保存数组大小N
并将其作为第一个N
元素加载到更长的数组?到目前为止我使用的是BinaryFormatter
,但我不知道我是否可以在这里使用它。
如何告诉GC
从内存中删除原始数组?
答案 0 :(得分:3)
您是否已调查始终将数组存储在文件中并使用该文件的可能性?
现在,您可以使用Memory-Mapped Files在C#(以及Win API)中执行此操作。基本上,这允许您映射一个内存缓冲区,可以访问非常大的文件的应用程序部分,并对它们进行读/写。在我发布的链接中有一个明显的例子,它显示了基本知识以及如何导航"通过非常大的文件在内存中查看。
在您的情况下,您想要定义自己的文件格式(没什么特别的),并决定如何在文件中分离这些数组。可能你会想要一个包含元数据的标题(多少个数组,它们的偏移量等)和一个内容部分,至少分成多个部分。
我认为这是一种更直接的处理方式,而不是交换内存中的内容+每次都要担心GC。