1

我有一个程序,它读取文件的每一行,根据由正则表达式定义的特定格式提取数据。我可以调用文件的全部内容,而不是对文件中的每一行调用Match()多次。Match()哪个是更有效的解决方案?

后一种选择将需要该RegexOptions.Multiline选项。

更新:

该文件由最终用户指定,因此它可能很大(~37000 行,~2MB)。不必每行都包含有效条目。

我使用的正则表达式是^\s*(OPTL_\w*)\s*=>\s*(\d+)\s*$. 例如,这将匹配由 text 组成的行OPTL_Example => 123,但不会匹配由 text 组成的行FooBar => 999

4

4 回答 4

2

所以取决于你是在优化速度还是稳定性。

如果这是一个最终用户应用程序并且无法控制文件大小或内存,那么我会采取安全路线并逐行读取以保护内存。清楚地在循环外构建正则表达式,因此您只需在循环中调用 .Match 。ReadLine 非常快。

可以设置一些并行处理,以便在执行解析时读取下一行。但是那个简单的正则表达式会很快,不确定它会更快。一次一行或整个文件的磁盘 IO 读取文件很可能是最慢的操作。

如果这是一个分布有限且速度很关键的服务器应用程序,那么请全部阅读。

于 2012-11-28T15:27:34.593 回答
0

这取决于您需要的内存限制。如果您有多个正则表达式,您可以在整个文件上运行,将整个文件保存在内存中同样有效。但是,如果您的正则表达式修改行(然后重复此过程,级联正则表达式相互依赖),我会逐行解决。

于 2012-11-28T14:43:42.090 回答
0

选择逐行解决方案可以让您并行运行正则表达式。问题是并行处理的所有开销是否值得。如果您的正则表达式很复杂和/或您对行进行了一些其他处理,那么可以并行运行,我至少会尝试一下。

于 2012-11-28T14:53:46.370 回答
0

它没有通用和/或正确的答案,因为它取决于许多因素。I/O 的主要速度。你为什么不测试这两种解决方案?我希望使用 2MB 的大小来更快、更高效地处理整个内容。

于 2012-11-28T15:07:13.623 回答