У меня есть редактор, реализованный с использованием AvalonEdit
, и когда я открываю новый файл, я заполняю Document
новым TextDocument
и заполняю TextDocument
IEnumerable<char>
. То, что IEnumerable
просто читает файл, char-by-char, из потока.
У нас недавно было cra sh при открытии большого файла. Большое значение 600 МБ открытого текста. Не спрашивайте, я думаю, что это нелепо, но необходимо иметь возможность просматривать файлы такого размера для нашего приложения. После нескольких отладок я обнаружил, что конструктор TextDocument
падает с OutOfMemoryException
, в частности, где-то, где «Размеры массива превышают поддерживаемый диапазон». Вот соответствующая часть трассировки стека:
System.OutOfMemoryException: Array dimensions exceeded supported range.
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at ICSharpCode.AvalonEdit.Utils.Rope`1.ToArray(IEnumerable`1 input)
at ICSharpCode.AvalonEdit.Utils.Rope`1..ctor(IEnumerable`1 input)
at ICSharpCode.AvalonEdit.Document.TextDocument..ctor(IEnumerable`1 initialText)
...
В своей отладке я обнаружил, что это происходило последовательно на 134217728-м символе (2 ^ 27). Это кажется произвольным пределом, есть ли причина, по которой это будет ограничением? Я ожидаю, что ограничение длины массива будет int.MaxValue
. Похоже, это как-то связано с созданием Rope, но я пока не смог go в исходный код Rope<T>
.