0

通常,当我使用 搜索文件时grep,搜索是按顺序完成的。是否可以执行非顺序搜索或并行搜索?或者例如,在一行l1和一行之间进行搜索,l2而不必通过第一l1-1行?

4

3 回答 3

1

您可以使用在给定的行偏移处tail -n +N file | grep开始 a 。grep

您可以结合head使用tail以仅在固定范围内进行搜索。

但是,这仍然必须扫描文件以查找行尾字符。

通常,顺序读取是磁盘的最快读取。尝试进行并行搜索很可能会导致随机磁盘搜索并且性能更差。

对于它的价值,一本典型的书每页包含大约 200 个单词。通常每个单词 5 个字母,每页大约 1kb,所以 1000 页仍然是 1MB。标准台式机硬盘可以在几分之一秒内轻松读取。

您无法以这种方式加快磁盘读取吞吐量。事实上,我几乎可以保证,对于这么小的文件,您现在的磁盘读取率不会饱和。您可以使用iostat来确认。

如果您的文件完全是 ASCII,您可以通过将语言环境设置为C语言环境来加快处理速度,以避免进行任何类型的 Unicode 转换。

如果您需要对同一个文件进行多次搜索,则值得构建一个反向索引来进行搜索。对于代码,有诸如 exuberant ctags 之类的工具可以为您做到这一点。否则,您可能正在考虑构建自定义工具。有一些工具可以在大型语料库上进行一般文本搜索,但这对你来说可能有点过头了。您甚至可以将文件加载到支持全文搜索的 Postgresql 等数据库中,并让它为您建立索引。

将行填充到固定的记录长度不一定能解决您的问题。正如我之前提到的,我认为您在整个问题中都没有 IO,您只需将文件移动到您创建的临时 ram 磁盘即可看到。这消除了所有潜在的 IO。如果这对您来说仍然不够快,那么您将不得不寻求完全不同的解决方案。

于 2015-05-03T01:35:24.237 回答
1

如果您的行是固定长度的,您可以使用dd读取文件的特定部分:

dd if=myfile.txt bs=<line_leght> count=<lines_to_read> skip=<start_line> | other_commands

请注意,dd它将使用为输入 (bs) 指定的块大小从磁盘读取。这可能很慢并且可以通过一次读取一组行来批量处理,以便从磁盘中提取至少 4kb。在这种情况下,您希望查看skip_bytescount_bytes标志能够在不是块大小倍数的行处开始和结束。另一个有趣的选项是输出块大小obs,它可以受益于输入相同或单行。

于 2015-05-03T05:55:38.883 回答
0

简单的答案是:你不能。你想要的东西自相矛盾:你不想扫描整个文件,你想知道每一行的结束位置。如果不实际扫描文件,您将无法知道每一行的结束位置。QED ;)

于 2015-05-03T02:11:11.647 回答