Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析数千个文件会导致速度减慢_C#_Xml_File_System.io.file - Fatal编程技术网

C# 解析数千个文件会导致速度减慢

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

我试图在不到400个文件夹中解析大约300k XML文件

每个文件都很小,在前80到130个文件夹中,每个文件的平均时间为0毫秒。然而,在处理了不同数量的文件后,每个文件的平均显示时间为6毫秒

在任何给定的运行中,减速不会在同一点开始

我已尝试在程序中添加
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()
不太可能这样做。但是,请看,分块阅读效果会很好。