优化许多小文件的流媒体

时间:2012-08-21 18:17:53

标签: c# windows .net-4.0

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

虽然,一旦我抓取了目录并存储了List<string>中的文件路径,我现在想要对列表中存储的每个路径进行传递,并读取小文本文件的内容并执行一些基于读入的值的行动。

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

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

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

是否有更优化的方式通过C#加载许多小文本文件?我应该考虑一些互操作吗?或者这是我能期待的最好的?这看起来好像很长。

1 个答案:

答案 0 :(得分:3)

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

这样可以防止需要同时实际存储42,945个文件的列表,并且可以使用PLINQ开启并行执行某些处理的可能性(取决于文件的处理要求)。

如果处理的总时间占CPU总量的相当大(而且不是纯粹的I / O限制),这可能会在完成所需时间方面提供很大的好处。