3

我在 LAN 网络共享上有数十万个 0 到 8kb 的小文本文件。我可以使用一些互操作调用,kernel32.dllFindFileEx递归地提取每个文件的完全限定 UNC 路径的列表,并将路径存储在内存中的集合类中,例如List<string>. 使用这种方法,我能够List<string>相当快地填充(每个 50k 文件名大约 30 秒,而 3 分钟Directory.GetFiles)。

不过,一旦我爬取了目录并将文件路径存储在其中,List<string>我现在想对存储在列表中的每个路径进行传递,并读取小文本文件的内容并根据读取的值执行一些操作。

作为测试平台,我遍历了List<string>存储 42,945 个文件路径到此 LAN 网络共享的每个文件路径,并在每个文件路径上执行了以下行FileFullPath

            StreamReader file = new StreamReader(FileFullPath);
            file.ReadToEnd();
            file.Close();

因此,仅使用这些行,我的列表中存储的所有 42,945 个文件路径都需要 13-15 分钟的运行时间。

有没有更优化的方式通过 C# 加载许多小文本文件?我应该考虑一些互操作性吗?或者这几乎是我能期待的最好的?这似乎是一个非常长的时间。

4

1 回答 1

3

我会考虑使用Directory.EnumerateFiles,然后在您阅读文件时对其进行处理。

这将避免一次实际存储 42,945 个文件的列表的需要,并打开使用 PLINQ 并行执行某些处理的潜力(取决于文件的处理要求)。

如果处理在总时间中有相当大的 CPU 部分(并且它不是纯粹的 I/O 限制),那么这可能会在所需的完整时间方面提供很大的好处。

于 2012-08-21T18:23:03.267 回答