合并加入大文件的算法

时间:2011-08-11 13:57:00

标签: algorithm memory join merge large-files

假设我有四个大文件(太大而无法单独存入内存),这些文件包含我需要处理的信息。我打算从文件#1中的每一行生成一个应用程序级别对象(Record)。文件2-4各自具有组成该Record对象所需的附加信息。例如,文件结构可能如下:

文件#1:
密钥,说明

文件#2:
键,元数据,大小

文件#3:
来源,费率,关键

文件#4:
key,startDate,endDate

每个文件都有一个列(一行中已知位置),表示唯一键。此密钥在文件之间共享,但不保证任何一个文件中存在的每个密钥都存在于其他文件中,这意味着我们只会处理所有密钥中存在的密钥子集。文件行未排序。您可以通过处理这些文件来设计算法来生成应用级对象吗?

2 个答案:

答案 0 :(得分:2)

使用键值存储数据库

数据库是处理大于内存的数据集的最佳工具。将您的文件放入键值存储(像CouchDB或Cassandra这样的NoSQL DB会很棒)。使用关键查询解决您的问题。

使用排序和二进制搜索

如果您无法使用数据库,请根据键列对文件进行排序(这可以使用GNU sort轻松完成)。您可以使用密钥在nlogn时间内访问您的文件。迭代最大的文件,并使用对其他文件的调用处理每个记录。通过这种方式,您的磁盘读取可能会被缓存。

答案 1 :(得分:1)

您可以将所有内容转储到数据库中(实际上,一个普通的SQL就可以了),然后删除“不完整”的记录。

要按文件执行,您可以这样做:

  • 按ID键对所有文件进行排序
  • 打开所有已排序的文件
  • 读取每个文件的第一条记录
  • 如果您没有4个“匹配”记录,请丢弃ID最低的记录,直至
  • 合并4个“匹配”记录
  • 冲洗并重复