这在Linux环境中非常重要。
pi.txt是一个文本文件,它以一行形式列出pi的前十亿位(没有换行符,没有空格。)
现在查找任意序列的字符位置,例如334455,我正在这样做:
LANG = C grep -aob'334455'pi.txt |头-1
这真是太慢了,在这种情况下,我认为我已经尽可能地优化了grep。消耗100%的CPU,大约需要15秒。
有什么更好的解决方案?
答案 0 :(得分:1)
此答案可能与主题无关。如果可以,我将删除答案。
您可以尝试预先构建search tree来提高搜索速度,例如prefix tree,这样可以有效地缩短搜索时间。
但是,按照我目前的想法,为Pi构建搜索树几乎等于为所有查询构建字典/缓存...
下面是https://www.angio.net/pi/how.html的简单总结。
直接使用grep
更有可能执行linear search,这很慢且很胖。
对于“ fat”:根据ASCII,我们知道数字位于0x3*
的区域中,在Pi的文本表示形式中,所有的左斜位3
始终被复制,如果我们只想搜索,可以将其折叠。例如,在磁盘上存储14159265
可以优化为存储0x14 0x15 0x92 0x65
而不是ASCII存储0x31 0x34 0x31 0x35 0x39 0x32 0x36 0x35
。
慢速输入:如果输入很长,那么我们可以打包前4位数字,与打包前一个Pi的方式相同。然后,我们可以对2位数字进行一次比较,而朴素的线性搜索则每次比较仅对1位数字进行比较。
然后,他们做了一些基准测试,并使用了混合搜索:
对于长度<= 5的搜索,它们按照前面所述进行线性搜索。
对于更长的搜索,他们在suffix array的帮助下进行了索引搜索。
答案 1 :(得分:-1)
首先将文件一次读入内存怎么样?
A=$(<file)