c# - 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 中调试并拍摄内存快照并不考虑正在使用的内存。
垃圾收集似乎没有正确释放此内存。
解决方案
XmlSerializers 被缓存,因此运行时不必在一个已经可用的情况下重建一个,但前提是使用了正确的构造函数。
推荐阅读
- cadence-workflow - Uber Cadence 活动是否应该成为服务实施的一部分?
- javascript - JavaScript中引号内的冒号是什么意思?
- lua - 如何在这里增加“k”?
- swift - 自动续订订阅 purchase_date 和 expires_date 相等
- npm - 有什么办法可以防止在“npm install”之后自动对 package.json 中的 npm-packages 进行排序?
- oop - 如何命名子类?
- flutter - Flutter 中的 Web 和移动设备无法共享代码库(?)
- tensorflow-datasets - 我应该如何处理错误:--第 32 位的括号不平衡
- npm - 是否有将在 Visual Studio Code 中安装 NPM 的扩展?
- python - Pymongo - 无效的语法