Получение Count () с отложенным выполнением и отложенной загрузкой - PullRequest
0 голосов
/ 29 июня 2011

У меня есть код, который использует отложенное выполнение и отложенную загрузку:

    public static IEnumerable<XElement> GetStreamElementP(string fileId, ListProgressEventHandler progressHandler, int total)
    {
        var filePath = Utility.GetEContentFilePath(fileId);
        using (var reader = XmlReader.Create(filePath, new XmlReaderSettings { IgnoreWhitespace = true, }))
        {
            var cnt = 0;
            reader.MoveToContent();
            // Parse the file and display each of the p nodes.
            reader.Read();
            while (reader.NodeType == XmlNodeType.Element && reader.Name == "p")
            {
                cnt++;
                var returnedValue = XElement.ReadFrom(reader) as XElement;

                int rem = cnt % _streamElementCallBackSize;
                if (progressHandler != null && rem == 0)
                {
                    progressHandler(null, new ListProgressEventArgs { ItemsProcessed = cnt, TotalItemsToProcess = total, });
                }
                yield return returnedValue;
            }
            reader.Close();
        }

    }

Я рассчитываю на простой подсчет количества элементов. Текущий код, который мы используем:

    public static int FileElementsCount(string fileId)
    {
        var cnt = 0;
        foreach (XElement e in GetStreamElementP(fileId))
        {
            cnt++;
        }
        return cnt;
    }

Могу ли я улучшить это до?

    public static int FileElementsCount(string fileId)
    {
        return GetStreamElementP(fileId).Count<XElement>();
    }

Или это приведет к использованию большего количества памяти при подсчете? В некоторых случаях мы имеем дело с очень большими файлами и пытаемся по возможности сократить использование памяти до минимума.

Я попытался найти конкретный пример, который объясняет, как память используется в каждом случае без какого-либо успеха.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Это не имеет значения. И ваш метод, и метод count внутренне выполняют прямой цикл (здесь нет ленивых вещей) над результатом GetStreamElementP. Нет никакого кеширования или чего бы то ни было.

Если вы хотите, чтобы это было быстрее, вы должны либо найти умный способ кэширования / предварительного вычисления результата GetStreamElementP-, либо иметь вариант на GetStreamElementP, который делает более умный счет непосредственно для файла

0 голосов
/ 29 июня 2011

В вашем случае оба способа вычисления количества будут выполняться одинаково.

Потребление памяти этой функцией должно быть пропорционально размеру <p> элементов.Таким образом, если есть много мелких элементов, он не должен занимать большие объемы памяти.Если у вас относительно мало огромных элементов, это может занять довольно много памяти, потому что вы создаете XElement из каждого из них.Если бы это было так, потребление памяти можно было бы сделать намного меньше, если бы их вообще не создавали.

...