我有一个.NET Core 2.0,它正在处理超过30,000个XML文件的列表,并且似乎存在内存泄漏。
现在我所要做的就是一次读取一个文件,将文件内容添加到列表中,然后移至下一个文件。
这些文件没有任何反应,但是每个文件我的程序内存正在增加.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循环运行时,我的内存都会增加.5MB,并且随着我拥有的文件数量的增加,它很快就会超过15GB。在VS中进行调试并为该内存拍摄快照时,它不会考虑正在使用的内存。
垃圾回收似乎无法正确释放此内存。
答案 0 :(得分:0)
XmlSerializers会被缓存,因此只有在使用正确的构造函数的情况下,运行时才可以重建一个运行时。