Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Database 从1亿行字符串中搜索字符串_Database_Algorithm - Fatal编程技术网

Database 从1亿行字符串中搜索字符串

Database 从1亿行字符串中搜索字符串,database,algorithm,Database,Algorithm,我有一个包含一些md5哈希的文本文件,其中有1亿行。我有另一个更小的文件,有几千个md5散列。我想找到这些md5散列的相应索引,从这个新的较小文件到旧的较大文件 最有效的方法是什么?有可能在15分钟左右完成吗 我试过很多东西,但都不管用。首先,我尝试将较大的数据导入数据库文件,并在md5哈希列上创建索引。创建此散列需要花费很长时间。我甚至不确定这是否会大大提高查询速度。建议?首先:100兆行/32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易

我有一个包含一些md5哈希的文本文件,其中有1亿行。我有另一个更小的文件,有几千个md5散列。我想找到这些md5散列的相应索引,从这个新的较小文件到旧的较大文件

最有效的方法是什么?有可能在15分钟左右完成吗


我试过很多东西,但都不管用。首先,我尝试将较大的数据导入数据库文件,并在md5哈希列上创建索引。创建此散列需要花费很长时间。我甚至不确定这是否会大大提高查询速度。建议?

首先:100兆行/32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易实现

我建议不要使用数据库,而是使用包含一些简单步骤的过程:

  • 对您的数据进行排序—您只需执行一次,并且您可以将大部分数据并行化
  • 将小文件读入内存(按数组排序)
  • 循环此阵列:
  • 逐行读取大文件,与数组的当前行进行比较(首先比较第一个字节,然后比较第一个字节和第二个字节,…),直到达到匹配(输出索引)或传递值(输出“未找到”)
  • 移动到下一个数组元素

  • 初始排序可能很容易花费超过15分钟的时间,但查找速度应该相当快:如果您有足够的RAM(以及支持大于2GB进程的操作系统),您应该能够以至少一个数量级的速度获得比较速率

    首先:100兆行×32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易实现

    我建议不要使用数据库,而是使用包含一些简单步骤的过程:

  • 对您的数据进行排序—您只需执行一次,并且您可以将大部分数据并行化
  • 将小文件读入内存(按数组排序)
  • 循环此阵列:
  • 逐行读取大文件,与数组的当前行进行比较(首先比较第一个字节,然后比较第一个字节和第二个字节,…),直到达到匹配(输出索引)或传递值(输出“未找到”)
  • 移动到下一个数组元素

  • 初始排序可能很容易花费超过15分钟的时间,但查找速度应该相当快:如果您有足够的RAM(以及支持大于2GB进程的操作系统),您应该能够以至少一个数量级的速度获得比较速率

    不要在db中执行此操作-使用简单的程序。

  • 将小文件中的md5哈希读入内存中的哈希映射,以便快速查找
  • 然后逐个读取大文件中的md5,并检查该行是否在哈希映射中
  • 散列映射中的平均查找时间应接近O(1),因此这一过程的处理时间基本上是您读取大文件的速度


    使用这种方法,今天的硬件很容易获得15分钟的时间。

    不要在db中这样做-使用一个简单的程序。

  • 将小文件中的md5哈希读入内存中的哈希映射,以便快速查找
  • 然后逐个读取大文件中的md5,并检查该行是否在哈希映射中
  • 散列映射中的平均查找时间应接近O(1),因此这一过程的处理时间基本上是您读取大文件的速度


    使用这种方法,用今天的硬件很容易获得15分钟的时间。

    有专门为搜索大文件中的多个字符串而设计的算法。其中之一是拉宾·卡普。我有一本书

    更简单地说,下面的伪代码应该可以让您很快到达目的地:

    Load your few thousand strings in a set data structure
    For each line (index: i) in your file
        If that line appears in your set of values
            print i
    

    这将非常快:设置的数据结构几乎可以立即查找,因此IO将是罪魁祸首,1亿个哈希和将在15分钟内完成,不会有太大的困难。

    有专门为搜索大文件中的多个字符串而设计的算法。其中之一是拉宾·卡普。我有一本书

    更简单地说,下面的伪代码应该可以让您很快到达目的地:

    Load your few thousand strings in a set data structure
    For each line (index: i) in your file
        If that line appears in your set of values
            print i
    
    这将非常快:设置的数据结构几乎可以立即查找,因此IO将是罪魁祸首,1亿个哈希和将在15分钟内完成,不会有太多困难。

    假设:

    (1) 小文件中的每条记录都显示在大文件中

    (2) 每个文件中的数据是随机排序的

    选项:

    (1) 对于大文件中的每条记录,线性搜索小文件以查找匹配项。由于大多数搜索不会找到匹配项,因此时间将接近 NLAGER*Nsmall*k 其中k表示尝试一次匹配的时间

    (2) 对于小文件中的每条记录,线性搜索大文件以查找匹配项。由于每次搜索都会找到匹配项,因此时间大约为 n大/2*n小*k

    这看起来是选项(1)的两倍——但前提是您可以将大文件完全放入快速内存中。您可能需要6 GB的RAM

    (3) 将小文件排序为易于搜索的形式。一个平衡的二叉树是最好的,但是一个排序的数组几乎同样好。或者,您可以相信一些方便的哈希表对象的作者在CS学校已经引起了注意。对于大文件中的每条记录,在结构化小文件中搜索匹配项。时间将是 log2 Nsmall*s 要对小文件进行排序,其中s表示对一条记录进行排序的时间,加上 log2 Nsmall*NLAGE*k 进行扫描。这使总时间为 log2 Nsmall*(s+Nlarge*k)

    (4) 对大型fi进行排序