2015-03-16 2 views
2

Мое приложение читает множество данных из текстовых файлов, которые попадают в кучу больших объектов, что в конечном итоге вызывает проблему фрагментации. Существуют ли альтернативные дизайнерские подходы, которые могут помочь не донести их до LOH? Я знаю о StringBuilder, но кажется, что чтение из текстового файла по-прежнему создает большие строки в LOH.Как избежать строк, вызывающих фрагментацию в LOH

+0

LOH только в 85 000 байт ... Я думаю, вы читаете целые файлы в строки? Вам просто нужно прочитать его в кусках. –

+1

Как вы читаете этот файл? Если это проблема, вам нужно получить доступ к файлу в небольших кусках, а не в том, что-то вроде «ReadAllLines». – vcsjones

+0

Большинство мест, которые я делаю через ReadLine, хотя есть несколько мест, где это делается через ReadAllLines. Выполняя это с помощью ReadLine, мне все равно нужно объединить все эти строки как одно, которое выполняется с помощью StringBuilder – BKS

ответ

1

Если вы не хотите менять вызовы на ReadAllLines, то нет возможности избежать выделения LOH, когда строки достаточно велики (не до конца клонируя ретрансляцию .Net github, изменяя стратегию распределения и перекомпилируя ее) , Любое другое решение увидит либо чтение небольших строк из файла, либо чтение файла в виде байтов в ваш собственный буфер, где вы затем будете управлять распределением и компоновкой байтов самостоятельно, скорее всего, увеличьте его, создав свой собственный класс строк (поскольку System.String всегда копирует в свой собственный буфер).

Однако у вас теперь есть выбор с .Net> = 4.5.1: уплотнение LOH. Чтобы выполнить это вручную, выполните следующие действия: