从数据库中读取大字符串而不会破坏大对象堆

时间:2011-06-05 15:51:50

标签: .net garbage-collection large-object-heap

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

编辑 - 我正在使用带有DataReader的SqlClient对象。

2 个答案:

答案 0 :(得分:2)

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

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

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

这完全取决于您使用的数据库提供程序或ORM。

答案 1 :(得分:1)

虽然LOH碎片确实是一个问题,但它不能保证是一个问题。我有长时间运行的程序,它们在24小时内分配了数以千万计的短期大型对象,并且LOH堆碎片从未出现问题。

这是你应该注意的事情,但它显然不像你可能相信的那样常见。我建议你让程序按原样运行,除非你看到一些迹象表明LOH是一个问题。