2011-06-05 54 views
4

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

编辑 - 我正在使用SqlClient对象和DataReader。

回答

2

您不能重复使用string s,因为它们是不可变的。

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

或者你可以将你的列加载到一个char数组(或一个byte数组),只要它足够大就可以重用。尽管如此,这一切都取决于您使用的数据库提供程序或ORM。

+0

我正在使用SqlClient对象。 – supercat 2011-06-06 02:06:56

+0

然后我链接的文章直接适用于你。 – svick 2011-06-06 02:10:27

+0

事实上,它看起来正是我所追求的。谢谢。 – supercat 2011-06-06 03:13:11

1

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

这是你应该知道的东西,但它显然不像有些人可能会相信的那样常见问题。我建议你让程序运行,除非你看到一些迹象表明LOH是一个问题。

+0

至少,有大量物品进入LOH意味着它们不会被收集到2级收藏之前,是不是?我的程序(一种特殊类型的服务器)似乎在多个客户端一次连接时陷入停滞状态,多余的L2堆分配看起来可能会导致性能下降。 – supercat 2011-06-06 02:10:16

+0

@supercat:是的,它*可能会导致性能下降。我的经验是,它更好(更快,更有效),并以简单的方式进行编码。那么如果出现性能问题,请寻找替代品。但你的里程可能会有所不同 – 2011-06-06 15:02:11