我有19GB或更高的文件,它们将是巨大的,但已经排序。在搜索某个字符串是否存在时,我可以使用它们对我有利的事实吗? 我看了一下叫做sgrep的东西,但不确定它是不是我要找的东西。一个例子是我将拥有一个包含数百万行
的19GB文本文件ABCDEFG,1234,1月21日,stackoverflow
我想搜索这些数百万行的第一列,看看这个巨大的文本文件中是否存在ABCDEFG。 有没有一种更有效的方法,然后只是为字符串greping这个文件,看看是否有结果。我甚至不需要该行,我只需要一个布尔值,如果它在此文件中则为true / false
答案 0 :(得分:3)
实际上sgrep就是我想要的。我感到困惑的原因是因为结构化的grep与排序的grep具有相同的名称,而我正在安装错误的包。 sgrep很棒
答案 1 :(得分:0)
我不知道是否有任何实用程序可以帮助您解决方案,但是编写特定于您的问题的应用程序会非常简单。二进制搜索可以很好地工作,并且应该在20-30个查询中产生结果。
假设你的行不超过100个字符,文件长度为B字节。
用您最喜欢的语言做这样的事情:
sub file_has_line(file, target) {
a = 0
z = file.length
while (a < z) {
m = (a+z)/2
chunk = file.read(m, 200)
// That is, read 200 bytes, starting at m.
line = chunk.split(/\n/)[2]
// split the line on newlines, and keep only the second line.
if line < target
z = m - 1
else
a = m + 1
}
return (line == target)
}
如果您只进行一次查找,这将显着加速您的计划。而不是阅读〜20 GB,你将阅读~20 KB的数据。
您可以尝试通过推断&#34; Xerox&#34;来优化这一点。将占据文件的98%并在那里开始中点...但除非你对优化的需求非常极端,否则你真的不会看到很多不同。无论如何,二进制搜索将使你在4或5次通过中接近。
如果您正在进行大量查找(我刚刚看到您的评论),我会将所有数据泵入数据库,您可以随意查询。
答案 2 :(得分:0)
因此,如果您正在进行100,000次查找,但这是一个一个又一个完成的过程,在数据库中没有持续值,您可以采取另一种方法......
对目标列表进行排序,以匹配日志文件的排序顺序。然后并行浏览每个。你仍然会阅读整个20 GB的文件,但你只需要做一次,然后你就会得到所有答案。像这样:
sub file_has_lines(file, target_array) {
target_array = target_array.sort
target = ''
hits = []
do {
if line < target
line = file.readln()
elsif line > target
target = target_array.pop()
elseif line == target
hits.push(line)
line = file.readln()
} while not file.eof()
return hits
}