Bash 非顺序搜索文件
通常,当我使用Bash 非顺序搜索文件,bash,search,parallel-processing,nonsequential,Bash,Search,Parallel Processing,Nonsequential,通常,当我使用grep搜索文件时,搜索是按顺序进行的。是否可以执行非顺序搜索或并行搜索?或者,例如,在行l1和行l2之间进行搜索,而不必经过第一行l1-1。您可以使用tail-n+n file | grep在给定行偏移处开始grep 您可以将head与tail组合起来,只在固定范围内搜索 但是,这仍然必须扫描文件以查找行尾字符 通常,顺序读取是磁盘的最快读取。尝试执行并行搜索很可能会导致随机磁盘搜索,并且执行得更糟 不管它值多少钱,一本典型的书每页大约有200字。通常每个单词有5个字母,每页大约
grep
搜索文件时,搜索是按顺序进行的。是否可以执行非顺序搜索或并行搜索?或者,例如,在行l1
和行l2
之间进行搜索,而不必经过第一行l1-1
。您可以使用tail-n+n file | grep
在给定行偏移处开始grep
您可以将head
与tail
组合起来,只在固定范围内搜索
但是,这仍然必须扫描文件以查找行尾字符
通常,顺序读取是磁盘的最快读取。尝试执行并行搜索很可能会导致随机磁盘搜索,并且执行得更糟
不管它值多少钱,一本典型的书每页大约有200字。通常每个单词有5个字母,每页大约有1kb,所以1000页仍然是1MB。一个标准的桌面硬盘可以在几分之一秒内轻松读取
这样无法提高磁盘读取吞吐量。事实上,我几乎可以保证,对于这么小的文件,您现在的磁盘读取速率不会达到饱和。您可以使用iostat
进行确认
如果您的文件完全是ASCII,您可以通过将区域设置设置为C
locale来避免进行任何类型的Unicode转换,从而加快速度
如果您需要对同一个文件执行多个搜索,那么构建反向索引来执行搜索是值得的。对于代码,有一些工具可以为您做到这一点,比如丰富的CTAG。否则,您可能正在考虑构建自定义工具。有一些工具可以在大型小体上进行一般的文本搜索,但这对您来说可能有些过头了。您甚至可以将该文件加载到支持全文搜索的数据库(如Postgresql)中,并让它为您构建索引
将行填充到固定的记录长度并不一定能解决问题。正如我前面提到的,我不认为您在整个问题中都有IO,您可以通过简单地将文件移动到您创建的临时ram磁盘来看到这一点。这就消除了所有潜在的IO。如果这对你来说还不够快,那么你将不得不寻求一个完全不同的解决方案。简单的答案是:你不能。您想要的是自相矛盾的:您不想扫描整个文件,但您想知道每行的结束位置。如果不实际扫描文件,就无法知道每行的结束位置。QED;) 如果行的长度固定,可以使用
dd
读取文件的特定部分:
dd if=myfile.txt bs=<line_leght> count=<lines_to_read> skip=<start_line> | other_commands
dd if=myfile.txt bs=count=skip=|其他_命令
请注意,dd
将使用为输入指定的块大小(bs)从磁盘读取数据。这可能会很慢,并且可以通过一次读取一组行进行批处理,以便从磁盘中提取至少4kb的数据。在这种情况下,您希望查看skip_bytes
和count_bytes
标志,以便能够在不是块大小的倍数的行开始和结束。
另一个有趣的选项是输出块大小
obs
,它可以从输入相同或一行中受益。bash是您的首选语言吗?正确,我只在终端和脚本编写时使用bash。您的文件有多大,行大小是否相同?如果你有相同大小的行,你可以做固定的字节偏移,这会快得多。一个文件可以是一本书的大小,比如说多达1000页或更多。这对于计算机来说很小。通过并行化任务,您不太可能看到实际性能的提高。这很公平。假设我通过添加任何必要的空字符使文件有90个字符行。我需要执行哪些命令来扫描行之间的l1
到l2
。在bash中,您可以使用前面建议的head
和tail
),但它们还是执行读取操作,因此不会比您想象的更为优化。如果你想让它超级高效,你最好自己编写一个简单的C程序。基本文件I/O并不是那么难做,特别是当它只是读取时。然后,您可以在打开的文件中查找(即移动文件指针),而无需实际读取数据。这是否需要固定的行长度?这取决于您希望它的准确性。否则你总是会回到扫描换行符的问题上。准确吗??那是怎么回事?