如何针对排序值优化findstr

时间:2018-06-14 23:41:32

标签: powershell full-text-search findstr

假设我有一个巨大的文本文件,其行的格式如

Id Name Address

所有记录按Id排序。如果我正在搜索Id,如何使用findstr或写出比findstr更好的内容来提高搜索效率?

1 个答案:

答案 0 :(得分:1)

作为本机应用程序,如果findstr具有比PowerShell代码甚至已编译的.NET模块中实现的大多数任何内容更好的搜索性能,我不会感到惊讶。 findstr的问题是它对数据的结构一无所知。也就是说,如果您搜索ID为123的记录,则会很高兴地将ID为1234或地址为"123 Main Street"的记录作为误报。您可以使用/B/R开关来解决此问题,但在您搜索不存在的ID的情况下,这仍然无济于事; findstr只有在到达文件末尾时才会停止搜索。

您执行优化搜索的能力取决于文本文件的特定格式。如果行是固定长度的,这意味着您只需计算$n即可立即搜索$n * $lineLength行,然后您可以使用binary search快速搜索文件中的ID。

如果行是可变长度的,那么实际上没有简单方式来有效地搜索除逐行之外的文件。即使您已经阅读了足够多的行来知道ID不匹配,您仍然需要阅读该行的其余部分以了解下一行的开始位置。最好的情况是,由于这些行是按ID排序的,因此您知道如果您遇到的ID大于您要搜索的行,则可以立即中止搜索,因为找不到该ID。 / p>

在过去,我已经能够对具有可变长度行的文本文件使用二进制搜索(如果不需要,固定大小的字符也将非常有用)。关键是搜索的每次迭代,计算你的下一个偏移,如果它恰好落在一行的开头,那就太好了;如果没有,向后搜索,直到您可以识别出该行开头的字符(例如前面有CrLf)。一旦您将自己定位在一行的开头,您就可以阅读该ID并确定它是匹配的还是下一次搜索迭代需要查看的方向。

它绝对不是一个快速而简单的解决方案(写入),但是,根据巨大的数字",它可能会在搜索文件时产生显着的结果。虽然,在这一点上,如果可能的话,最好将开发时间用于更改为更易于搜索的存储数据的方式。