【问题标题】:serializing and deserializing large files序列化和反序列化大文件
【发布时间】:2009-12-23 16:03:11
【问题描述】:

有没有什么好的方法可以在c#中对大文件(>10M)进行序列化和反序列化。

提前致谢。

【问题讨论】:

标签: c# serialization


【解决方案1】:

对小文件或大文件进行反序列化/序列化没有任何区别。您只需要确保不会将非常大的文件反序列化到内存中,否则会导致 OOM。

当然,大文件需要更多时间。如果这使您的用户界面无响应,那么您将希望在后台线程中进行此处理。 BackgroundWorker 是一个典型的解决方案。

顺便说一句,这里在黑暗中随机拍摄,你的问题太模糊了。

【讨论】:

    【解决方案2】:

    你可以查看我对这个问题的回答here(那里也有各种其他相关的答案)。

    我的方法使用 BinaryReader 和 BinaryWriter 来提高性能。

    我在最近的一个项目中使用这种方法反序列化了 50MB 的文件,与内置序列化或 Xml 序列化(我的数据集需要 10 分钟)相比,它的反序列化速度非常快(不到 5 秒)。

    【讨论】:

      【解决方案3】:

      您确定序列化/反序列化是处理这么多数据的正确方法吗?也许像 SQLite 这样的客户端数据库会是更好的解决方案,您可以在其中查询所需的确切数据,而不仅仅是将所有内容加载到内存中?

      【讨论】:

        【解决方案4】:

        如果您确实有大文件(假设大于 100 MB),最好只加载您目前需要的内容。

        假设您有一个包含 10.000 位客户的列表 - 每个客户都有一张图片。将此列表保留在内存中是没有意义的。

        例如,您可以加载文件中的所有姓氏和人的位置。所以用户可以搜索一个人,你可以准确地加载那个人。

        另一种可能性是加载前十个并将它们显示给用户。只要他点击“下一步”按钮,您就可以加载接下来的十个 - 只需计划如何组织信息。

        数据库可以带来一些优势,而不是非常大的文件。他们可以抽象出在文件中导航所需的大量工作。

        在我看来,使用 BinaryFormatter 等的“单行序列化”在这种大小的文件中达到了极限。您必须考虑其他概念。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-17
          • 1970-01-01
          • 2016-11-14
          • 2017-05-16
          相关资源
          最近更新 更多