C# 解析数千个文件会导致速度减慢
我试图在不到400个文件夹中解析大约300k XML文件 每个文件都很小,在前80到130个文件夹中,每个文件的平均时间为0毫秒。然而,在处理了不同数量的文件后,每个文件的平均显示时间为6毫秒 在任何给定的运行中,减速不会在同一点开始 我已尝试在程序中添加C# 解析数千个文件会导致速度减慢,c#,xml,file,system.io.file,C#,Xml,File,System.io.file,我试图在不到400个文件夹中解析大约300k XML文件 每个文件都很小,在前80到130个文件夹中,每个文件的平均时间为0毫秒。然而,在处理了不同数量的文件后,每个文件的平均显示时间为6毫秒 在任何给定的运行中,减速不会在同一点开始 我已尝试在程序中添加Thread.Sleep(5000)和GC.Collect(),如果平均时间大于1毫秒(无效) 在观察CPU、内存和磁盘使用情况时,它们似乎一点也不失控 下面是我在本地机器上运行的代码示例。我不认为这里有任何争议,除非XMLDocument.L
Thread.Sleep(5000)
和GC.Collect()
,如果平均时间大于1毫秒(无效)
在观察CPU、内存和磁盘使用情况时,它们似乎一点也不失控
下面是我在本地机器上运行的代码示例。我不认为这里有任何争议,除非XMLDocument.Load中有一些奇怪的东西
public void Traversefolders()
{
string[] folders = Directory.GetDirectories(debug_root + @"\App_Data\AllPublicXML");
Console.WriteLine($"Searching for data in {folders.Count()} folders");
int total = folders.Length;
for (int i = 0; i < total; i++) {
ReadFiles(i, total, folders[i]);
}
}
public void ReadFiles(int index, int total, string folder)
{
Stopwatch s = new Stopwatch();
s.Start();
string[] files = Directory.GetFiles($@"{folder}", "*.xml");
foreach (string file in files) {
XmlDocument doc = new XmlDocument();
doc.Load(file);
// READ XML DOC
// at this point I am checking the value of a single
// field in the XML doc
// eventually more will happen here, but I’m in early
// dev phases
// and am prototyping
}
double avg = s.ElapsedMilliseconds / files.Count();
Console.WriteLine($"Completed {Path.GetFileName(folder)} including {files.Length} files in {s.ElapsedMilliseconds} miliseconds (avg: {avg}) {index+1} of {total}");
if (avg > 1) {
Thread.Sleep(5000);
GC.Collect();
}
}
public void遍历文件夹()
{
string[]folders=Directory.GetDirectories(debug_root+@“\App_Data\AllPublicXML”);
WriteLine($“搜索{folders.Count()}文件夹中的数据”);
int total=文件夹长度;
对于(int i=0;i1){
睡眠(5000);
GC.Collect();
}
}
有没有人在C#中解析大量文件时有过减速的经验
这里可能出了什么问题?您可能遇到了防病毒软件吗?可能是您的程序,可能是.NET运行时环境之外的东西,如操作系统文件缓存、干扰/拦截存储I/O访问的第三方服务,或者仅仅是您使用的存储硬件/系统的某些影响。简言之,它基本上(几乎)可以是任何东西。现在,由于问题中的信息量非常有限,我们在这里所能做的就是玩一个将尾巴钉在驴子身上的游戏…如果你在短时间内接触大量文件,一些反病毒软件会有一些启发式方法来避免赎金软件。。。猜猜他们在做什么:在短时间内接触大量文件。基本上,f.e.复制这些文件所需时间的5-10倍,因为现在每个文件都被监视是否发生“加密”(获取文件、读取id、复制加密、删除原始文件)
XmlDocument
占用了相当大的内存。你可能只是花时间在垃圾收集上。你介绍过吗?您是否可以尝试用流式算法替换当前算法,并测量性能差异?如果流式传输比XmlDocument
快得多,那么它可能是您的代码中的某些内容。如果性能同样糟糕,则可能与操作系统类似的防病毒软件有关。@elgonzo-File.ReadAllBytes()
可以返回一个足够大的字节数组,以便放在大对象堆上XmlDocument.Load()
不太可能这样做。但是,请看,分块阅读效果会很好。