通常,当我使用grep
搜索文件时,搜索是顺序完成的。是否可以执行非序列搜索或并行搜索?或例如,在行l1
和行l2
之间进行搜索,而无需通过第一行l1-1
行?
您可以使用tail -n +N file | grep
在给定的线偏移量开始grep
。
您可以将head
与tail
结合在一起,仅在固定范围内搜索。
但是,这仍然必须扫描文件的末端字符。
通常,顺序读取是磁盘最快的读取。尝试进行并行搜索很可能会导致随机磁盘寻求并表现更糟。
对于它的价值,一本典型的书每页包含大约200个单词。每个单词典型的5个字母,您每页约为1KB,因此1000页仍然是1MB。标准桌面硬盘驱动器可以轻松地读取一秒钟的一小部分。
您不能以这种方式加快磁盘读取吞吐量。实际上,我几乎可以保证您不会立即将磁盘读取率饱和,因为文件很小。您可以使用iostat
确认。
如果您的文件完全是ASCII,则可以通过将其设置为C
语言环境来加快事物的速度,以避免进行任何类型的Unicode翻译。
如果您需要通过同一文件进行多次搜索,则值得构建反向索引进行搜索。对于代码,有一些工具,例如繁殖的CTAG,可以为您做到这一点。否则,您可能正在寻找构建自定义工具。有一些工具可以在大型工作中进行一般文本搜索,但这可能对您来说是过分的。您甚至可以将文件加载到支持全文搜索的PostgreSQL之类的数据库中,并为您构建索引。
将线条填充到固定的记录长度不一定会解决您的问题。正如我之前提到的,我认为您在整个问题中都没有IO,您可以通过简单地将文件移至创建的临时RAM磁盘来看到您。这消除了所有潜在的IO。如果那还不够快,那么您将不得不寻求完全不同的解决方案。
如果行固定长度,则可以使用dd
读取文件的特定部分:
dd if=myfile.txt bs=<line_leght> count=<lines_to_read> skip=<start_line> | other_commands
请注意,dd
将使用指定的输入(BS)的块大小从磁盘读取。这可能会很慢,可以通过一次阅读一组线条,以便您从磁盘中拉出至少4KB。在这种情况下,您想查看skip_bytes
和count_bytes
标志,以便能够以不属于块大小的多个线路启动和结束。另一个有趣的选项是输出块大小obs
,这可能会受益于输入或单行相同。
简单的答案是:您不能。您想要的是自我矛盾的:您不想扫描整个文件,,但是您想知道每行的结束位置。如果没有实际扫描文件,您就不知道每行的结束位置。QED;)