database - 逻辑 : Best way to sample & count bytes of a 100MB+ file

标签 database file process methods generics

假设我有这个 170mb 的文件(大约 1.8 亿字节)。我需要做的是创建一个,其中列出:

  1. 找到所有 4096 字节组合 [column 'bytes'],并且
  2. 每个字节组合在其中出现的次数 [column 'occurrences']

假设两件事:

  1. 我可以非常快保存数据,但是
  2. 我可以更新保存的数据非常慢

我应该如何采样文件并保存所需的信息?

这里有一些(非常)慢的建议:

  • 遍历文件中的每个 4096 字节组合,保存每个数据,但首先在表中搜索现有组合并更新其值。 这慢得令人难以置信
  • 遍历文件中的每 4096 字节组合,在临时表中保存直到 100 万行数据。遍历该表并修复条目(组合重复字节组合),然后复制到大表。重复遍历另外 100 万行数据并重复该过程。 速度快了一点,但仍然慢得令人难以置信

这有点像对文件进行统计。

注意: 我知道对文件进行采样会生成大量数据(根据经验,大约 22Gb),而且我知道发布的任何解决方案都需要一些时间才能完成。我需要最有效的保存过程

最佳答案

如果您还散列数据并将 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

散列段不是免费的,但它非常便宜,并且散列之间的比较比重复地相互比较完整字节段要便宜几个数量级。哈希对许多应用程序都很有用 - 这绝对是其中之一。

关于database - 逻辑 : Best way to sample & count bytes of a 100MB+ file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3053929/

相关文章:

php - 几分钟后如何销毁 session

process - Linux 内核代码执行上下文

c++ - 关于使用 C++ 使用命令行参数调用 CreateProcessAsUser 的说明

c - 了解 fork() 系统调用的工作原理

c - 如何从 C 中的 .txt 文件读取数据?

ruby - 如何获取某个进程正在读取的打开文件的文件指针位置?

mysql - 创建存储过程时出现语法错误: 1064 ,

c# - 只是无法让 Entity Framework 拉出我想要的东西

PHP if 函数

c# - 使用C#将文件 move 到目录下