假设我有这个170mb的文件(大约1.8亿字节)。我需要做的是创建一个表,列出:
假设两件事:
如何对文件进行采样并保存所需信息?
以下是一些(非常)缓慢的建议:
这有点像获取文件的统计信息。
注意: 我知道对文件进行采样可以生成大量数据(大约22Gb来自经验),我知道任何解决方案都需要花费一些时间才能完成。我需要最有效的保存流程
答案 0 :(得分:1)
如果您还散列数据并将4096字节段的散列存储在数据库中,那么您提供的第一个解决方案可能会大大加快,然后与之进行比较。与长度为4096字节的字符串相比,它将永远占用,但这会明显更快:
For each 4096-byte segment in the file
Hash the segment into something short (even MD5 is fine, and it's quick)
Look up the hash in your database
If it exists (segment may have already been found)
Compare the actual segment to see if there's a match
If it doesn't exist
It's a new segment - save it to your database
散列这段不是免费的,但它相当便宜,而且散列之间的比较比重复比较全字节段要便宜几个数量级。哈希对许多应用程序都很有用 - 这绝对是其中之一。
答案 1 :(得分:0)
这有点晚了,我无法直接思考,所以我的算法复杂度计算有点关闭:)但是如果你设法将它放到内存中,你可能会有一个非常快速的实现{{3} }。如果你可以优化每个trie节点以尽可能少地占用内存,那么它可能会起作用。
另一件事基本上是@rwmnau的建议,但不要使用像MD5这样的预定义哈希函数 - 使用运行总计。与哈希不同,这几乎是免费的,没有任何缺点,如此大的块大小(4096字节有很多随机性)。对于每个新块,您将获得一个字节,并丢失一个字节。所以计算前4096字节的总和;对于每个后续的,只需减去丢失的字节并添加新的字节。根据您执行总和的整数的大小,您将拥有大量的存储桶。然后,您将有更少的块数来逐字节进行比较。