Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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
Sorting 如何查看大型(>19GB)排序文件中是否存在字符串?_Sorting_Unix_Grep - Fatal编程技术网

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

Sorting 如何查看大型(>19GB)排序文件中是否存在字符串?,sorting,unix,grep,Sorting,Unix,Grep,我有19GB或更大的文件,它们将是巨大的,但排序。在搜索某个字符串是否存在时,我是否可以利用这样一个事实,即它们是按我的优势排序的? 我看了一个叫sgrep的东西,但不确定它是否就是我要找的。例如,我将有一个19GB的文本文件,其中包含数百万行 ABCDEFG,12342001年1月21日 我只想搜索这数百万行的第一列,看看这个巨大的文本文件中是否存在ABCDEFG。 是否有一种更有效的方法,只需将该文件中的字符串变灰,然后查看是否有结果。我甚至不需要这行代码,我只需要一个布尔值,如果它在这个文

我有19GB或更大的文件,它们将是巨大的,但排序。在搜索某个字符串是否存在时,我是否可以利用这样一个事实,即它们是按我的优势排序的? 我看了一个叫sgrep的东西,但不确定它是否就是我要找的。例如,我将有一个19GB的文本文件,其中包含数百万行

ABCDEFG,12342001年1月21日

我只想搜索这数百万行的第一列,看看这个巨大的文本文件中是否存在ABCDEFG。
是否有一种更有效的方法,只需将该文件中的字符串变灰,然后查看是否有结果。我甚至不需要这行代码,我只需要一个布尔值,如果它在这个文件中,则为true/false。我不知道是否有任何实用程序可以帮助您解决这个问题,但是编写一个针对您的问题的应用程序是非常简单的。二进制搜索可以很好地工作,并且应该在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 KB的数据,而不是读取约20 GB的数据

你可以通过推断Xerox将占文件的98%并从中间点开始,尝试对此进行一些优化……但是除非你对优化的需求非常极端,否则你真的不会看到太大的差异。无论如何,二进制搜索将使您在4或5次传递内接近


如果你在做大量的查询,我刚才看到你的评论,你会是,我会期待泵所有的数据到一个数据库,你可以在那里随意查询

实际上,sgrep就是我要找的。我之所以感到困惑是因为结构化grep与排序grep的名称相同,而且我安装了错误的包。sgrep是惊人的

因此,如果您正在进行100000次查找,但这是一个一次性的过程,在数据库中使用它没有持续的价值,您可以采取另一种方法

对目标列表进行排序,以匹配日志文件的排序顺序。然后并行地遍历每一个。你最终还是会阅读整个20GB的文件,但你只需要做一次,然后你就会得到所有的答案。大概是这样的:

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
}

你需要做多少次查找?最好的方法取决于你是需要查找一个键,还是一百万个键。你总是要在一行的前导字段中搜索吗?这可能会影响如何利用排序顺序。您是否要对静态数据进行大量查找?或针对不断变化的数据进行少量查找?查找的数量会有所不同,最多可达100k。它将永远是该行的领先领域,我将使用linux排序优先对这些文件进行排序,尽管如此,我认为我应该使用排序后的文件来发挥我的优势,但我不确定是否可以。然后列表将保持不变,不变。感谢您向我介绍sgrep。那看起来是个方便的工具!我认为,如果100000次sgrep调用满足了您的需求,就用它运行,永远不要回头。但是,如果这花费的时间太长,请尝试一下这个答案,因为您将在一次通过中获得所有答案。我认为读取整个20 GB文件将是一项负担。但是,如果您已经致力于对文件进行排序,则再通过一次读取结果将是无关紧要的。