【问题标题】:Extending huge array using hard drive使用硬盘扩展巨大的阵列
【发布时间】:2014-09-21 07:31:16
【问题描述】:

由于科学原因,我正在解决九人莫里斯游戏。我正在尝试保存有关某些游戏状态子集的信息。不幸的是,我达到了我的内存限制。

我有几个非常大的数组。当新元素出现时,我需要扩展这些数组。我有足够的内存来存储这些数组,但是我负担不起创建原始数组仍在内存中的扩展数组。

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

有没有什么快速的方法来保存数组大小N 并将其作为第一个N 元素加载到更长的数组中?到现在我用的是BinaryFormatter,不知道这里能不能用。

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

【问题讨论】:

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


【解决方案1】:

您是否研究过始终将数组存储在文件中并使用该文件的可能性?

现在,在 C#(以及 Win API)中,您可以使用 Memory-Mapped Files 做到这一点。基本上,这允许您映射到非常大文件的应用程序部分可访问的内存缓冲区并读取/写入它们。在我发布的链接中有一个清晰的示例,它显示了基础知识以及如何使用内存视图“导航”通过一个非常大的文件。

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

我认为这是一种更直接的处理方法,而不是在内存中换入/换出内容 + 在每一步都必须担心 GC。

【讨论】:

  • 我对这个数组进行了排序,以便对它们进行二进制搜索。我不认为使用文件会足够快。
  • @Ari:真不幸。您仍然可以尝试 Fibonacci 搜索,当搜索数据存储在磁盘上时,它的性能比二分搜索略有提升。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2017-02-15
  • 2011-05-19
相关资源
最近更新 更多