Метод синтаксического анализа статического XML-кода в веб-службе, занимающий слишком много памяти? - PullRequest
2 голосов
/ 29 марта 2011

У меня есть веб-сервис, который делает веб-запрос на получение XML, анализирует его в пользовательский класс и возвращает этот класс.В качестве первого выбора я сделал вспомогательный класс «XMLParser» с необходимыми методами синтаксического анализа и сделал методы статическими, поскольку я не видел необходимости создавать экземпляр класса XMLParser.Но потом я начал задаваться вопросом, потребляет ли это больше памяти, чем должно.Предложения?

РЕДАКТИРОВАТЬ

По запросу, какой-то код.Я упростил код, чтобы перейти прямо к делу.

WebMethod, называемый

[WebMethod]
public List<CustomObject> GetObjectList(int xmlID)
{
    string xmlURL = URLBuilder.GetXmlURL(xmlID); // Also static method that builds and returns an URL
    HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create(xmlURL);
    xmlRequest.Method = "GET";

    try
    {
        using (Stream responseStream = xmlRequest.GetResponse().GetResponseStream())
        {
            XmlDocument XML = new XmlDocument();
            XML.Load(responseStream);

            return XMLParser.GetCustomObjectList(XML);
        }
    }

    catch
    {
        throw;
    }
}

И статический метод, о котором я беспокоюсь

public static List<CustomObject> GetCustomObjectList(XmlDocument XML)
{
    XmlNodeList nodesList = XML.GetElementsByTagName("some_tag");
    List<CustomObject> obj = new List<CustomObject>();

    foreach (XmlNode listingNode in listingNodesList)
    {
        // Read Nodes and add CustomObjects to the obj List
    }

    return obj;
}

Это будет постоянно анализировать XML и возвращать списки CustomObject.При любом изменении каждого синтаксического анализа память выделяется и никогда не освобождается?

1 Ответ

0 голосов
/ 04 января 2012

У меня тоже похожая проблема. Когда я записываю ответ StreamReader от HttpWebResponse в какую-то строку, он выделяет много памяти (для примерно 100 000 строк xml в ответ он достигает 800 МБ). Фактические данные не так велики, и я понятия не имею, что делать.

Я не использую статический класс или метод. В отладке я вижу, что «огромное» выделение происходит для одного конкретного ответа, а освобождение зависит от логики сборки мусора (IMHO).

Теперь я пытаюсь как-то разделить данные. Если у меня будут какие-то результаты, я обновлю этот пост.

(Извините за неясный ответ, я не могу добавить его в качестве комментария)

...