【问题标题】:Serialization with BinaryFormatter *PERFORMANCE* issuesBinaryFormatter *PERFORMANCE* 问题的序列化
【发布时间】:2011-04-07 13:01:55
【问题描述】:

背景:

我被 LARGE 对象图所困扰,它被序列化为大约 60MB 的文件(并且会随着时间的推移而增长)。问题不在于文件大小,而在于写入和读取时间,在某些机器上长达 4 分钟。

剧情:

由于这代表某种内存数据库,我可以延迟加载其中的一些。

刺激:

如何测量特定对象块的加载时间?我是否记录构造函数调用并从那里开始?有更好的主意吗?

编辑:

我宁愿不谈论序列化的替代方案,有很多关于该主题的帖子,我宁愿调查为什么它这么慢以及对象图的哪一部分是“切除”和延迟加载的良好候选者。

【问题讨论】:

  • 我只是很感兴趣,你的对象图代表什么?还有什么比相当平坦的数据列表/表格更令人兴奋的吗?
  • 你序列化是为了做什么?保存到磁盘?
  • 它是内存数据库。表、对象等...
  • 我的图表中有一个严重的错误......解决了它,数据文件从 60mb 降到了 3mb,现在每个人都很开心 :)

标签: .net performance serialization binaryformatter


【解决方案1】:

您可以尝试protobuf.NET,据报道它更快。

【讨论】:

    【解决方案2】:

    我会考虑使用SQL Server Compact(Microsoft 的进程内数据库)而不是序列化大型对象图。

    我有使用 BinaryFormatter 将大图序列化到磁盘的经验。存在与版本控制相关的问题。序列化对象也很难维护和使用。使用此类对象通常需要反序列化到内存中。处理大图是一种消耗资源的方式。

    而且 Sql Server CE 是相当轻量级的,它的程序集大约是 1Mb。它还处理一些多线程问题。

    如果您需要序列化只是为了通过网络或其他方式发送,我想 60Mb 是相当大的数组,传输它可能会出现问题。

    更新

    如果您想使用 BinaryFormatter,我想您可以不将图形序列化为一个根对象,而是将其序列化为较小对象的集合。也许序列化所有对象会慢一些,但它会让你只序列化对象的一部分。如果您有异构数组(即不同类型的对象序列),我可以假设对象越复杂,其层次结构越深,序列化它所需的时间就越多。您可以测量相同类型对象集合的序列化时间。您还可以使用一些分析器来序列化整个图,大多数分析器会告诉您哪个方法需要更多时间来执行。

    【讨论】:

    • 在缺少其他参数的情况下,我将在 Server 的数据表中介绍这一点:2 与 SQL Server 的任何连接都需要 SQL Server 客户端访问许可证 (CAL),包括来自 SQL Server 的连接精简版。 3 必须在线签署一份简单的再分配协议。
    • 我的意思是,我不希望我的用户更加依赖 M$,他们拥有 Windows 就足够了 :)
    • 好吧,他们已经有了 Windows 和 .NET,所以他们将拥有另一个小型简单的嵌入式数据库并不重要 :) 顺便说一句,如果他们有 MSN Messenger,他们已经有 SqlServerCE (谁在使用 MSN Messenger :))。
    • 回到正题。如果您不想要 MS,您可以使用其他东西,例如 sqlite.orgoracle.com/technetwork/database/berkeleydb/overview/index.htmlmemcached.org(也许)。我不喜欢 Sqlite,它很蹩脚,我们在使用 Sqlite 处理大量数据时遇到了问题,而 SqlServerCE 成功处理了多达 1Gb 的同时连接的数据库(我将它用作网络 Windows 服务的存储)。有一些方法可以最大限度地使用 SqlServerCe。
    • 有时我们选择的工具不合适,仅此而已,我们对此无能为力。你不能用纸做的斧头砍树:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2015-05-07
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多