0

我正在制作一个组合生成器。对于少量元素,数据存储在 RAM 内存中而不是文件中对计算机来说不是问题。但是当元素数量变大时,我的计算机内存不足(发生 OutOfMemoryException 异常)。这些组合是存储在列表中的数字,当前存储在另一个列表中。

但这只是第一步——发电机工作正常。我希望将数据存储在文件中,不同的程序可以从中提取所需的组合。大多数情况下,我需要将数据存储在单独的文件中,因为生成器将来必须能够创建越来越多更大的组合。计算机将不得不读取数据的某些部分,而不是将其全部存储在临时存储器中,因为这是不可能的。

我不想将数据转换为文本,并在需要时将文本转换回数据。我认为由于转换,这会使事情变慢。我希望将列表存储到自定义文件中,程序可以从中直接提取数据而无需任何转换。

4

4 回答 4

3

有很多可用的选项,我将简要描述一些。

  • 使用数据库。根据您的描述,这看起来不是一个好的选择,但它将是所有客户最灵活的相对快速和高效的存储。

  • 使用描述二进制序列化程序中的 .net 序列化程序之一将是您的最佳选择。serlizers 提供了很多相对快速的优势,并通过内置支持融入 .net,并且非常易于使用。

  • 使用自定义二进制格式。这将是最快的选择,尤其是当您将它与内存映射文件结合使用时。然而,二进制格式可能难以使用且容易搞砸。

于 2012-07-26T15:01:43.590 回答
3

如果您真的想将数据存储在文件中,可以使用BinaryFormatter类。这可能是将数据对象序列化为二进制流的最有效方式。

但是,如果您不需要一次存储它们并在此之后加载很长时间,我不建议您以这种方式生成组合。最好使用惰性生成组合。一个接一个,完全生成,无需“在未来生成更大的组合”(一个接一个生成“最大”所需的组合 - 你可能想要稍微改变你的生成算法 - 已经有很多答案如何做到这一点)

于 2012-07-26T15:03:08.830 回答
2

在http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file上有一篇关于如何将 List<> 序列化为文件的好文章

于 2012-07-26T15:00:41.347 回答
0

您可以使用某些东西作为持久数据结构,这将减少您的应用程序所需的内存量,而不会过多地更改当前代码。看看这个问题:

在 C# 中寻找一个简单的独立持久字典实现

有很多资源这样做,特别是这个答案似乎指向一些非常有趣的链接:

于 2012-07-26T15:00:24.263 回答