0

我负责开发一个在生产服务器上运行的应用程序,它旨在搜索和替换每个 ini、xml 和配置文件扩展名中的一些特定字符串,我必须关心性能(总共 150 台服务器)。在替换之前,我必须备份文件。实现这一目标的最佳方法是什么?顺便说一句,我可以使用 Dot Net 4.0,但最好使用 3.5,因为不是每个服务器都有 4.0,但如果有很大的优势,我可以更新到 4.0。现在我在想这样的事情:

String[] arrayFiles = Directory.GetFiles(strFylesystem , strExtensao, SearchOption.AllDirectories);
        foreach (string s in arrayFiles ){
            File.Copy(pathOrigin + s, pathNew);
            searchFound = false;
            foreach (string line in File.ReadAllLines(pathNew + s){
                if (line.contains("string_searched")){
                    line.Replace("string_searched", new_string);
                    searchFound = true;
                }
                if (!searchFound){
                    File.Delete(pathNew + s);
                }
            }
        }

我发现一些论坛使用 Lambda、PLINQ e 正则表达式。除了个人喜好之外,这些对我的表现有帮助吗?例如:如果不是使用File.ReadAllLines我开发使用,性能会更好StreamReader吗?有没有办法包装findStr从窗口并获得性能改进?

4

1 回答 1

0

您的限制因素将是磁盘访问速度,而您无法加快速度。当然,使用 Lambda 表达式不会产生性能差异。

除非您有多个驱动器,否则并行搜索将无济于事。也就是说,让两个线程在同一个驱动器上的不同目录上工作可能会减慢速度,因为它们会争用磁盘访问。

一个潜在的问题是您在枚举驱动器上的所有文件时在驱动器上创建新文件。如果你不小心,你可能会陷入无限循环。也就是说,您读取 x.xml,创建一个新文件 x.new.xml,然后找到 x.new.xml,更改它等等。您最好扫描整个驱动器并构建一个列表要更改的文件。然后浏览该列表,进行更改。

我建议您不要使用 C# 执行此操作。相反,编写两个 PowerShell 脚本。第一个在驱动器中搜索与您的条件匹配的文件,并将这些文件名写入文件。第二个从该文件中读取文件名,并处理这些文件。有关示例,请参见https://stackoverflow.com/a/60065/56778 。

这可能不会像 C# 程序那么快,但我怀疑它会慢很多。同样,您的限制因素是磁盘访问速度,而不是处理速度。您的开发时间将是几个小时而不是几天。而且修改 PowerShell 脚本比修改 C# 程序更容易。

于 2013-04-12T15:17:46.210 回答