2016-10-26 5 views
-1

У меня есть StringBuilder длиной 1,539,121,968. При вызове StringBuilder .ToString() на нем сбой OutOfMemoryException. Я попытался создать массив символов, но не был создан для создания такого большого массива.Получить UTF8.GetBytes из очень большого stringbuilder

Мне нужно сохранить его в массиве байтов в формате UTF8. Является ли это возможным?

+6

Есть ли шанс, что вы могли бы избежать создания такого огромного StringBuilder для начала? Это возможно, чтобы потопить это, но это довольно много работы ... возможно, лучше пересмотреть свой подход. –

+2

Максимальный размер любого объекта в .NET составляет 2 ГБ. Однако посмотрите [this] (https://msdn.microsoft.com/en-us/library/hh285054 (v = vs.110) .aspx). – itsme86

+3

Просто * не создавайте такой StringBuilder, это не его работа. StringBuilder предназначен для упрощения построения строки, а не для работы в качестве буфера. Вместо этого используйте «StreamWriter» с кодировкой UTF8, который выводит все, что вы хотите для адресата. Используйте большой буфер, если обнаружите, что на диск слишком много записей. По умолчанию 8 КБ Я думаю –

ответ

2

Я бы предложил посмотреть документацию на потоки. Это может помочь.

Другой способ приблизиться к нему - это разделить его. Что касается вашего последнего комментария о том, что вы хотите сохранить его как ByteArray с UTF8, вам понадобится char[], как и вы потеряете свою кодировку. Я бы рекомендовал разделить его на несколько небольших строк (или char[] s), хранящихся в отдельных объектах, которые можно легко восстановить. Что-то вроде этого может быть достаточно, создать много StringSlice S:

public class StringSlice() 
{ 
    public Str {get;} 
    public Index {get;} 
    public StringSlice(string str, int index) 
     { 
       this.Str = str; 
       this.Index = index; 
     } 

    public static List<string> ReconstructString(IEnumerable<StringSlice> parts) 
     { 
       //Sort input by index return list with new strings in order. Probably have to use a buffer on the disc so as not to breach 2GB obj limit. 
     } 
} 

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