2011-06-05 51 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