Database 从1亿行字符串中搜索字符串
我有一个包含一些md5哈希的文本文件,其中有1亿行。我有另一个更小的文件,有几千个md5散列。我想找到这些md5散列的相应索引,从这个新的较小文件到旧的较大文件 最有效的方法是什么?有可能在15分钟左右完成吗Database 从1亿行字符串中搜索字符串,database,algorithm,Database,Algorithm,我有一个包含一些md5哈希的文本文件,其中有1亿行。我有另一个更小的文件,有几千个md5散列。我想找到这些md5散列的相应索引,从这个新的较小文件到旧的较大文件 最有效的方法是什么?有可能在15分钟左右完成吗 我试过很多东西,但都不管用。首先,我尝试将较大的数据导入数据库文件,并在md5哈希列上创建索引。创建此散列需要花费很长时间。我甚至不确定这是否会大大提高查询速度。建议?首先:100兆行/32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易
我试过很多东西,但都不管用。首先,我尝试将较大的数据导入数据库文件,并在md5哈希列上创建索引。创建此散列需要花费很长时间。我甚至不确定这是否会大大提高查询速度。建议?首先:100兆行/32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易实现 我建议不要使用数据库,而是使用包含一些简单步骤的过程:
初始排序可能很容易花费超过15分钟的时间,但查找速度应该相当快:如果您有足够的RAM(以及支持大于2GB进程的操作系统),您应该能够以至少一个数量级的速度获得比较速率 首先:100兆行×32字节=约3.2 GB的数据。在15分钟内读取它们可以转换为每秒3.5兆字节,这在现代硬件中应该很容易实现 我建议不要使用数据库,而是使用包含一些简单步骤的过程:
初始排序可能很容易花费超过15分钟的时间,但查找速度应该相当快:如果您有足够的RAM(以及支持大于2GB进程的操作系统),您应该能够以至少一个数量级的速度获得比较速率 不要在db中执行此操作-使用简单的程序。
使用这种方法,今天的硬件很容易获得15分钟的时间。不要在db中这样做-使用一个简单的程序。
使用这种方法,用今天的硬件很容易获得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进行排序