Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 非顺序搜索文件_Bash_Search_Parallel Processing_Nonsequential - Fatal编程技术网

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并不是那么难做,特别是当它只是读取时。然后,您可以在打开的文件中查找(即移动文件指针),而无需实际读取数据。这是否需要固定的行长度?这取决于您希望它的准确性。否则你总是会回到扫描换行符的问题上。准确吗??那是怎么回事?