【问题标题】:Handling massive in memory objects in .NET在 .NET 中处理大量内存对象
【发布时间】:2010-11-03 20:20:12
【问题描述】:

基本上,我有一个非常大的列表,其中包含相对较大的字典。

所以基本上,我有一个非常大的内存集合。

然后我手动将此集合序列化为 XML,并通过 http 发送。不用说,XML 太大了,有时太大了,我什至在尝试发送它之前就得到了 OutOfMemory 异常。

在 .NET 中,我将如何计算潜在的内存使用量。 例如,在这种情况下,我必须通过在一次。

如何有效地即时计算每个“块”的大小。我不想选择任意数字,例如“一次处理 100 个项目”, 我想知道,根据具体情况,每个块应该有多大。

干杯

更新

尽管@Jacob 为这个特定问题提供了最佳解决方案,但应用程序的概念结构本身存在缺陷。

确实,解决方案是执行消息的一部分,以便在使用集合时计算消息的潜在大小。

然后,您将每个可接受大小的单元一个接一个地发送出去。

但这只是一个技巧。真正的解决方案是要么找到一种不传递大消息的方法,要么完全使用完全不同的协议。

有一个interesting post on the subject here,不过如果你想使用 SOAP,但我决定想办法解决发送这么多数据的问题。

【问题讨论】:

  • 您是否考虑过一种比 XML 更简洁的发送方式?或者 XML 是一成不变的
  • 嘿,克里斯,是的,我现在有。但是,无论我压缩多少,我可能仍然需要分块发送它。我对如何解决这个问题更加好奇和担心。虽然欢呼

标签: .net memory in-memory


【解决方案1】:

为什么不直接流式传输数据,以便在运行中转换为 XML,避免内存中存在巨大的 XML 文件?

【讨论】:

  • @albertein。嘿,阿尔伯特,谢谢。我从来没有直播过,你能澄清一下,并进一步分解吗?谢谢
  • @andy 首先我需要知道计划如何通过 http 发送它,告诉我,如果你有一个带有 xml 的巨大内存字符串,你会用它做什么?
  • @albert:好问题。我通过 SOAP 发送它。我想我现在不想改变整个事情,但我的应用程序肯定存在缺陷。我想我的问题应该是关于如何通过 http 处理一般的大量数据?
  • 你是怎么寄的?使用 WebRequest?
【解决方案2】:

我认为您可能比其他任何事情都更容易遇到概念问题。 “计算潜在内存使用量”与“有效计算每个块的大小”不一致。 真正将内存使用情况精确到可以预测足够大块大小的唯一方法是实际进行转换。

听起来最好的方法可能是逐步解决这个问题 - 基本上是那些建议使用流对象的人所说的。如果您无法利用实际的流式传输,您可能需要构建序列化结构,以便一次处理一个概念单元(即列表中的一项及其附带的字典子项)。

【讨论】:

    【解决方案3】:

    你是怎么寄的?您应该通过可以进行流式传输的 WCF 来执行此操作。它还可以通过配置让您选择是使用 XML 还是二进制文件,或者其他。

    【讨论】:

    • @john。谢谢约翰。现在实施 WCF 为时已晚。正如我对@Albert 所说,我没有预见到这种情况,但我现在看到了问题。也许我问错了问题。即使我使用二进制文件,它可能仍然很大。所有这些问题的解决方案是流式传输吗?
    • 与 WCF 的一大区别是它的效率要高得多,并且不会一次在内存中保留多个副本。此外,流媒体更容易。我认为我什至不知道如何使用 ASMX Web 服务进行真正的流式传输。
    • @john:谢谢约翰。那么,如果我要使用 WCF,然后流式传输,您是说,无论大小如何,它都会传输,因为它一次只传输位?超时问题呢,它可以播放多长时间?小时?不是我会发送这么大量的数据,而是为了争论......?
    • @andy:很抱歉,我对底层实现了解不够。即使它像一次发送一个缓冲区一样简单,只要它是可用的,那么它也不应该耗尽内存。这不是我能想到的最好的实现,所以我认为微软做得比这更好。
    【解决方案4】:

    如果发送有问题,接收不也有问题吗?你听起来像是在尝试解决一半的问题。 XML 是大数据的一大禁忌。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2010-09-06
      相关资源
      最近更新 更多