Чтение больших строк из базы данных без фрагментации кучи больших объектов - PullRequest
4 голосов
/ 05 июня 2011

У меня есть база данных, содержащая несколько довольно больших строк, каждая из которых содержит сериализованный иерархический сбор данных (данные хранятся в виде строк, а не в виде двоичного потока, чтобы обеспечить взаимодействие с VB6).Из того, что я могу сказать, любой запрос к базе данных, который возвращает строку размером более 85 000 байт, немедленно бросит эту строку в кучу больших объектов.Если строки сразу будут разделены на более мелкие части, и, таким образом, большие объекты будут недолговечны, есть ли способ избежать попадания этих объектов в кучу больших объектов и их бесполезного использования до следующей коллекции LOH?Я продолжаю читать, что объекты LOH следует использовать повторно, но я понятия не имею, как мне поступить в этом контексте.

EDIT - я использую объект SqlClient сDataReader.

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

Вы не можете повторно использовать string s, потому что они неизменны.

Что вы можете сделать, это либо поток данных из базы данных ( пример для ADO ), что означаетВы можете полностью избежать LOH.

Или вы можете загрузить свой столбец в массив char (или массив byte), который можно использовать повторно, если он достаточно большой.

Все это зависит от того, какого поставщика базы данных или ORM вы используете.

1 голос
/ 05 июня 2011

Несмотря на то, что фрагментация LOH может быть проблемой, она не гарантируется. У меня есть долгосрочные программы, которые выделяют десятки миллионов короткоживущих крупных объектов в течение 24 часов, и никогда не было проблем с фрагментацией кучи LOH.

Это то, о чем вы должны знать, но это, очевидно, не такая распространенная проблема, как некоторые могут поверить. Я предлагаю вам позволить программе работать как есть, если только вы не видите каких-либо признаков того, что LOH является проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...