.net 从数据库中读取大字符串而不分割大对象堆

.net 从数据库中读取大字符串而不分割大对象堆,.net,garbage-collection,large-object-heap,.net,Garbage Collection,Large Object Heap,我的数据数据库包含一些相当大的字符串,每个字符串都保存一个序列化的层次数据集合(数据存储为字符串而不是二进制流,以允许与VB6交互)。据我所知,任何返回超过85000字节的字符串的数据库查询都会立即将该字符串抛出到大型对象堆中。如果字符串立即被分割成更小的片段,那么大型对象将是短暂的,有没有办法避免这些对象进入大型对象堆并在下一个LOH集合之前无用地保留在那里?我一直在读LOH对象应该被重用的文章,但我不知道在这种情况下我将如何去做 编辑——我正在将SqlClient对象与DataReader一

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


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

不能重用
字符串,因为它们是不可变的

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

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


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

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


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

我正在使用SqlClient对象。然后我链接的文章直接适用于您。事实上,它看起来正是我想要的。谢谢。至少,让大型物品进入LOH意味着它们在2级收集之前不会被收集,不是吗?当多个客户端同时连接时,我的程序(一种特殊类型的服务器)似乎陷入了困境,而过多的L2堆分配似乎可能会导致性能低下。@supercat:是的,可能会导致性能低下。我的经验是,用简单的方法编写代码更好(更快、更有效)。然后,如果存在性能问题,请寻找替代方案。但是你的里程数可能会有所不同。