Как получить 1000000 записей и записать XML-канал в файл?

#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)