如何查看巨大的(> 19GB)排序文件中是否存在字符串?

时间:2015-01-22 01:41:39

标签: sorting unix grep

我有19GB或更高的文件,它们将是巨大的,但已经排序。在搜索某个字符串是否存在时,我可以使用它们对我有利的事实吗? 我看了一下叫做sgrep的东西,但不确定它是不是我要找的东西。一个例子是我将拥有一个包含数百万行

的19GB文本文件

ABCDEFG,1234,1月21日,stackoverflow

我想搜索这些数百万行的第一列,看看这个巨大的文本文件中是否存在ABCDEFG。 有没有一种更有效的方法,然后只是为字符串greping这个文件,看看是否有结果。我甚至不需要该行,我只需要一个布尔值,如果它在此文件中则为true / false

3 个答案:

答案 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
}