Предварительно выделить часть памяти в памяти кучи больших объектов - PullRequest
3 голосов
/ 11 июня 2011

Я работаю над приложением C #, и это приложение сталкивается с нехваткой памяти, поскольку многие объекты получают выделение памяти в куче больших объектов.

Моему приложению на C # приходится работать со многими большими файлами (как строковыми объектами), и поэтому память для этого строкового типа снова и снова выделяется из кучи Больших объектов (что приводит к фрагментации LOH).

Поскольку строка является неизменным объектом, этому объекту всегда назначается новая память в LOH. Мой вопрос: есть ли способ, я могу предварительно выделить некоторую память в куче больших объектов и всегда выделять одну и ту же память для строкового объекта.

Вот вещь более подробно: Как я уже говорил, я делаю обработку этих больших файлов. Чтобы сделать обработку, я должен преобразовать ее в строку. Даже если я использую stringBuilder, это не сильно поможет, потому что, как только я преобразую его в String, отдельная память для этого будет выделена в LOH.

Итак, я ожидал выделить кучу, скажем, 100 КБ в памяти, и всякий раз, когда я читаю новый файл и преобразовываю его в строку, эти 100 КБ выделяются.

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

Вы должны использовать объект StringBuilder для работы со строками, так как это изменяемая строка и предоставляет множество методов для работы с ней.

Вы говорите, что все строки создаются снова и снова.Если по какой-либо причине вам необходимо использовать строки, просто Intern их - они будут сохранены один раз и больше не будут добавляться в кучу памяти

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

Неясно, какие действия вы хотите выполнить со строками, ваш лучший снимок - это оценка окончательного результата (-ов). Используйте пессимистическую (большую) оценку и, возможно, добавьте маржу.

Затем создайте StringBuilder с параметром емкости:

var buffer = new StringBuilder(LargestExpectedSize);

Это, по сути, предварительное распределение на LOH. Избегайте (авто) выращивания StringBuilders или List<> s

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

Вы рассматривали возможность использования файла с отображенной памятью? http://msdn.microsoft.com/en-us/library/dd997372.aspx

Не знаю, что вы делаете со строками, но есть ли причина не работать с потоками?

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