Я пишу программу для форматирования 100 с Строковых данных МБ (приближающийся к концерту) в xml ==, И я обязан возвращать его, поскольку ответ на HTTP (ПОЛУЧАЕТ) запрос.
Я использую StringWriter/XmlWriter для создания XML записей в цикле и возврате
using (StringWriter writer = new StringWriter())
using (writer = XmlWriter.Create(writer, settings)) //where settings are the xml props
writer.ToString()
во время тестирования я видел некоторых - из исключений памяти - и довольно невежественный о том, как найти решение? Вы, у парней есть какие-либо предложения для оптимизированной доставки памяти ответа?
существует ли память эффективный способ закодировать данные? или возможно разделяя данные на блоки - я просто не могу думать, как возвратить их, не встраивая все это в один ОГРОМНЫЙ строковый объект
спасибо
- несколько разъяснений - это - asp приложение веб-сервисов .NET по ссылке Gigabit Ethernet как отмеченная добродушная шутка. Я не очень знаком с ним так все еще определенная кривая обучения.
Я использую XMLWriter, чтобы создать XML и создать строку из него с помощью Строки
некоторая статистика - ответ xml размер = приблизительно 385 megs (мой размер данных вырастит очень быстро к пути больше, чем это),
представьте размер объекта в виде строки, как вычислено профилировщиком памяти =, достиг максимума на уровне 605 МБ
и благодаря всем, кто ответил...
Нельзя ли просто передать ответ клиенту? XmlWriter не требует, чтобы его базовый поток буферизировался в памяти. Если это ASP.NET, вы можете использовать Response.OutputStream или если это WCF, вы можете использовать потоковую передачу ответа.
HTTP получить за 1 гиг? это много! Возможно, вам стоит пересмотреть свое мнение. По крайней мере, сжатие вывода может помочь.
Вам придется возвращать каждую запись (или небольшую группу записей) в их собственных индивидуальных GET.
Вы не должны создавать XML, используя манипуляции со строками.
Вместо этого вы должны использовать классы XmlTextWriter
, XmlDocument
или (в .Net 3.5) XElement
для построения XML-дерева в памяти, затем написать он напрямую в Response.OutputStream
, используя XmlTextWriter
.
Запись непосредственно в XmlTextWriter
, который обертывает Response.OutputStream
, будет наиболее эффективной (у вас никогда не будет в памяти целого дерева элементов сразу), но будет несколько больше сложный.
Поступая таким образом, у вас никогда не будет ни одной строки (или массива), содержащей весь объект, и поэтому следует избегать OutOfMemoryExceptions.
Используйте XmlTextWriter
, обернутый вокруг Reponse.OutputStream
для отправки XML клиенту и периодической промывки ответа. Таким образом, вам никогда не придется держать в памяти более нескольких мегабайт в каждый момент времени (по крайней мере, для отправки клиенту).