【问题标题】:Storing data into custom made files将数据存储到自定义文件中
【发布时间】:2012-07-26 14:50:18
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要将数据以二进制格式存储,或者使用数据库。
  • 这是很好的背景信息,但似乎没有任何问题。另外,您在代码方面是否有一些具体问题?如果是这样,请发布您迄今为止尝试过的内容。

标签: c# list file storing-data


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我只是在问如何存储数据。这是一个不同的问题,在这种情况下我将如何使用它。
    【解决方案3】:

    关于如何将列表序列化到http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file的文件中有一篇很好的文章

    【讨论】:

    • 本教程解释了如何将数据转换为文本文件,而这正是我不想做的。计算机将创建文件,计算机将读取它,而不是人类用户。我想将数据存储到一个非文本文件中,程序可以从中读取数据而无需任何转换。但是序列化是否允许将数据存储到非文本文件中?教程中没有提到这一点。
    • 我刚刚尝试了代码。它有一些小错误,但很容易解决。数据文件(尽管名称选择很不幸)绝对不是文本文件。
    • 不过,我必须弄清楚如何让程序读取文件。这也没有在教程中解释。我必须找到一种方法让程序读取文件的某些部分,而不读取整个数据(否则,计算机内存将在完成读取文件之前就被填满)。
    【解决方案4】:

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

    Looking for a simple standalone persistent dictionary implementation in C#

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 2014-11-30
      • 2016-11-26
      • 2019-07-23
      • 2018-06-11
      • 2017-10-24
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多