从数据库中读取大型字符串而不使大对象堆碎片化

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

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

2个回答

2
您不能重复使用字符串,因为它们是不可变的。您可以从数据库流式传输数据(ADO示例),这意味着您可以完全避免LOH。或者,您可以将列加载到一个char数组(或byte数组)中,只要它足够大,就可以重复使用。但这取决于您使用的是什么数据库提供程序或ORM。

我正在使用SqlClient对象。 - supercat
那么,我直接链接的那篇文章就适用于你。 - svick
确实,这正是我想要的。谢谢。 - supercat

1

虽然LOH碎片化可能是一个问题,但并不一定会成为问题。我有长时间运行的程序,在24小时内分配了数千万个短暂的大对象,它从未出现过LOH堆碎片化的问题。

这是你应该注意的事情,但显然并不像某些人所说的那样普遍存在问题。我建议你让程序按原样运行,除非你看到LOH是一个问题的迹象。


最起码,将大型项目放入LOH中意味着它们直到进行二级垃圾回收才会被收集,不是吗?当多个客户端同时连接时,我的程序(一种专门的服务器类型)似乎变得很慢,过多的L2堆分配可能会导致性能不佳。 - supercat
@supercat:是的,这可能会导致性能不佳。我的经验是最好(更快,更有效)先编写简单的代码。如果出现性能问题,再寻找替代方案。但你的情况可能有所不同。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接