大对象堆中的大字符串会导致问题 - 但无论如何它必须以字符串形式结束

Yan*_*nis 7 .net c# memory-management large-object-heap c#-4.0

我在这里跟进这个问题

我遇到的问题是我有一些来自MSMQ的大型对象,主要是字符串.我已经将我的内存问题缩小到在大对象堆(LOH)中创建的这些对象,因此将其分段(在探查器的帮助下确认).

在我上面发布的问题中,我得到了一些解决方法,主要是将String拆分为char数组,我做了.

我面临的问题是,在字符串处理结束时(无论采用何种形式),我需要将该字符串发送到另一个我无法控制的系统.所以我想到以下解决方案将此字符串放在LOH中:

  1. 将其表示为每个小于85k的char数组数组(要放置在LOH中的对象的阈值)
  2. 在发送方端压缩它(即在我们在这里讨论的系统中接收它之前,它是接收方)并在将其传递给第三方系统之前将其解压缩.

无论我做什么 - 不管怎样 - String必须完整(没有char数组或压缩).

我被困在这里吗?我在想如果在这里使用托管环境是一个错误,我们是否应该咬紧牙关去寻找C++类环境.

谢谢,Yannis

编辑:我已经缩小的问题正好代码贴在这里

通过的大字符串放在LOH中.我从已经收到消息的点开始删除了每个处理模块,并且内存消耗趋势保持不变.

所以我想我需要改变这个WorkContext在系统之间传递的方式.

Jen*_*ens 0

您也许可以实现一个类(称之为LargeString),它重用以前分配的字符串并保留它们的一小部分集合。

由于字符串通常是不可变的,因此您必须通过不安全的指针杂耍来完成每个更改和新的分配。将字符串传递给接收者后,您需要手动将其标记为免费以供重用。不同的消息长度也可能是一个问题,除非接收者可以处理太长的消息,或者您有各种长度的字符串集合。

可能不是一个好主意,但也许比用 C++ 重写所有内容更好。