AvalonEdit TextDocument cra sh чтение больших файлов - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть редактор, реализованный с использованием 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>.

...