首页 > 解决方案 > XmlReader 内存泄漏 .Net Core 2.0

问题描述

我有一个 .NET Core 2.0 正在处理超过 30,000 个 XML 文件的列表,并且似乎存在内存泄漏。

现在我的程序所做的只是一次读取一个文件,将文件内容添加到列表中,然后移动到下一个文件。

这些文件没有发生任何事情,但我的程序内存每个文件增加了 0.5 MB。文件本身在 5KB 到 10KB 之间。

这里是处理方法。

public async Task ProcessModelFile<TModel>(List<string> dataFileList) where TModel : InstitutionModel
    {
        foreach (var file in dataFileList)
        {
            var xmlLoadFile = new XmlLoadFile<TModel>();
            xmlLoadFile.AddFile(file, rootElementName: $"ArrayOf{TextService.GetClassNameFromType<TModel>()}");
        }
    }

以及 AddFile 方法和类:

internal class XmlLoadFile<TModel> where TModel : class
        {

            public List<TModel> ModelList { get; set; }

            internal void AddFile(string file, string rootElementName = "", bool HasHistoricalCutOff = false, DateTime? HistoricalCutOffDate = null)
            {
                using (XmlReader reader = XmlReader.Create(file, new XmlReaderSettings { CheckCharacters = false }))
                {
                    XmlSerializer serializer;

                    if (!string.IsNullOrWhiteSpace(rootElementName))
                    {
                        XmlRootAttribute rootElement = new XmlRootAttribute();
                        rootElement.ElementName = rootElementName;
                        serializer = new XmlSerializer(typeof(List<TModel>), rootElement);
                    }
                    else
                    {
                        serializer = new XmlSerializer(typeof(List<TModel>));
                    }

                    ModelList.AddRange((List<TModel>)serializer.Deserialize(reader));
                }
            }
        }

每次 foreach 循环运行时,我的内存都会增加 0.5MB,并且随着文件数量的增加,它会迅速超过 15GB。在 VS 中调试并拍摄内存快照并不考虑正在使用的内存。

垃圾收集似乎没有正确释放此内存。

标签: c#asp.net-core-2.0xmlserializer

解决方案


XmlSerializers 被缓存,因此运行时不必在一个已经可用的情况下重建一个,但前提是使用了正确的构造函数。


推荐阅读