2016-03-08 3 views
1

У меня есть этот метод, который, как ожидается, вернет строку, но строка довольно большая, может быть, в ГБ. В настоящее время это исключение из памяти.Как справиться с построкой строкой исключения из памяти

Я думал, что напишу файл (произвольное имя файла), затем прочитайте его, удалив файл и отправьте ответ. Пробовал MemoryStream и StreamWriter, которые тоже выбежали из памяти.

Не хотел инициализировать StringBuilder с емкостью, так как размер не был известен, и я думаю, что ему нужен непрерывный блок памяти.

Каков наилучший способ решения этой проблемы?

public string Result() 
    { 
     StringBuilder response = new StringBuilder(); 
     for (int i = 1; i <= Int.Max; i++) 
     { 
      response.Append("keep adding some text {0}", i); 
      response.Append(Environment.NewLine); 
     } 

     return response.ToString(); 
    } 
+0

Можете ли вы показать реальный код? – Blorgbeard

+0

Если вы использовали StreamWriter, и стратегия поддержки заключалась в записи в память, тогда да, вы получите исключение OutOfMemory. Вы можете попробовать использовать поток файлов, например, файл, который записывает в хранилище переходных процессов операционной системы (например, каталог temp). Если производительность не вызывает беспокойства, вы можете просто вызвать 'Flush()' в поток файлов после того, как вы напишете на него. Хотя, не было бы неправильно, предполагая, что вы просто напишите прямо в файл в этом случае без буферизации. – kevin628

+0

Лучше хранить записи по частям, чем сбрасывать их вместе. У вас есть код, в котором вы используете 'Result()'? – Ian

ответ

2

Даже если вы могли бы решить эту проблему памяти на StringBuilder, результирующая строка посредством вызова response.ToString() будет больше, чем максимальная длина строки в .NET см: https://stackoverflow.com/a/140749/3997704

Таким образом, вы будете иметь чтобы ваша функция сохранила свой результат в другом месте, например, в файле.