#c# #xml #console-application #feed
#c# #xml #консольное приложение #канал
Вопрос:
Я хотел бы создать консольное приложение c #, чтобы получить около 1000000 строк данных.
добавьте некоторую логику фильтрации в код и сгенерируйте XML-канал.
Тот, который я использую, работает нормально, но для 250 тысяч строк данных я получаю исключение нехватки памяти.
Вот пример кода, который я использую в веб-приложении, мне нужно изменить его в консольном приложении и сделать его эффективным.
var xrFeed = new XmlTextWriter(File.Create(@"c:Items.xml"), Encoding.UTF8);
xrFeed.WriteStartDocument();
xrFeed.WriteStartElement("Name");
IEnumerable<ItemClass> items = _source.GetItems();
if (items != null)
{
foreach (var i in items)
{
xrFeed.WriteStartElement("ad");
xrFeed.WriteStartElement("id");
xrFeed.WriteCData(m.ListingId.ToString());
xrFeed.WriteEndElement();
xrFeed.WriteStartElement("firstParameter");
xrFeed.WriteCData("parameter");
xrFeed.WriteEndElement();
xrFeed.WriteStartElement("secondParameter");
xrFeed.WriteCData("parameter2");
xrFeed.WriteEndElement();
xrFeed.WriteStartElement("thirdParameter");
xrFeed.WriteCData("parameter3");
xrFeed.WriteEndElement();
xrFeed.WriteEndElement();
}
xrFeed.WriteEndElement();
xrFeed.WriteEndDocument();
xrFeed.Flush();
xrFeed.Close();
Response.End();
DataBind();
}
Комментарии:
1. попробуйте переместить flush в цикле foreach
2. Какую версию .NET вы используете? Вам вообще не следует использовать
new XmlTextWriter()
(начиная с .NET 2.0), и вы могли бы лучше использовать LINQ to XML с помощью XStreamingElement .3. Откуда берется исключение ООМ? При циклическом просмотре строк данных или при чтении данных? Что такое
_source
?4. Я не удивлюсь, если
DataBind()
выдаст исключение.5. Я использую .net 3.5 — 4.0. Не могли бы вы, пожалуйста, показать мне пример более эффективного способа. Я получаю исключение во время цикла
Ответ №1:
Попробуйте сбрасывать программу записи каждые 1000 элементов или около того. Также вы можете частично извлечь данные из вашего источника данных.
Комментарии:
1. Просто попробовать? Используйте счетчик, проверьте, соответствует ли он 1000, затем очистите файл и сбросьте счетчик.
2. Сделайте так, как предлагает @Ramhound. Чтобы частично извлечь данные из вашего источника данных, это зависит от того, что это за источник данных. Linq? Чем использовать .Skip(X).Take(Y)