4

我有包含一些相当大的字符串的数据数据库,每个字符串都包含一个序列化的分层数据集合(数据存储为字符串而不是二进制流以允许与 VB6 交互)。据我所知,任何返回超过 85,000 字节字符串的数据库查询都会立即将该字符串扔到大对象堆中。如果字符串立即被分割成更小的部分,因此大对象将是短暂的,有没有办法避免让这些对象进入大对象堆并无用地留在那里直到下一次 LOH 收集?我一直在阅读 LOH 对象应该被重用,但我不知道在这种情况下我将如何去做。

编辑——我将 SqlClient 对象与 DataReader 一起使用。

4

2 回答 2

2

你不能重用strings,因为它们是不可变的。

您可以做的是从数据库中流式传输数据(例如 ADO),这意味着您可以完全避免 LOH。

或者您可以将您的列加载到一个char数组(或byte数组)中,只要它足够大,就可以重复使用。

不过,这一切都取决于您使用的是什么数据库提供程序或 ORM。

于 2011-06-05T16:33:44.690 回答
1

虽然 LOH 碎片确实可能是一个问题,但不能保证它是一个问题。我有长期运行的程序,在 24 小时内分配数千万个短期大对象,而且 LOH 堆碎片从来没有问题。

这是您应该注意的事情,但它显然不像某些人可能认为的那样普遍。我建议您让程序按原样运行,除非您看到一些迹象表明 LOH 是一个问题。

于 2011-06-05T17:09:45.843 回答