我有一个20GB以上的数据集,其结构如下:
1 3
1 2
2 3
1 4
2 1
3 4
4 2
(注意:重复是有意的,两列中都没有固有的顺序。)
我想构建以下格式的文件:
1: 2, 3, 4
2: 3, 1
3: 4
4: 2
这是我的问题;我尝试过用Python和C++编写脚本,以加载到文件中,创建长字符串,并逐行写入文件。然而,这两种语言似乎都无法处理手头的任务。有人对如何解决这个问题有什么建议吗?具体来说,是否有一种特定的方法/程序对此是最佳的?如有任何帮助或指导,我们将不胜感激。
您可以使用Hadoop进行尝试。您可以运行独立的Map Reduce程序。映射器将第一列输出为键,第二列输出为值。具有相同键的所有输出将进入一个减速器。所以你有一个键和一个带有该键的值列表。您可以运行值列表并输出(key,valueString),这是您想要的最终输出。您可以从一个简单的hadoop教程开始,并按照我的建议执行mapper和reducer。然而,我还没有尝试在独立的hadoop系统上扩展20GB的数据。你可以试试。希望这能有所帮助。
您尝试过使用std::vector
的std::vector
吗?
外部矢量表示每一行。外部向量中的每个槽都是一个向量,包含每行的所有可能值。这假设行#可以用作向量的索引。
否则,您可以尝试std::map<unsigned int, std::vector<unsigned int> >
,其中键是行号,矢量包含该行的所有值。
的std::list
也可以工作。
你的程序内存不足吗?
编辑1:处理大型数据文件
您可以将问题视为合并排序来处理。
为每个行号打开一个文件。将第2列的值附加到文件中。读取所有数据后,关闭所有文件。打开每个文件,读取值并打印出来,逗号分隔。
- 打开每个键的输出文件
- 在源文件的行上迭代时,将值附加到输出文件中
- 联接输出文件
在Stack Overflow 上也发现了一个有趣的想法
如果你想持久化一个大字典,你基本上就是在看一个数据库。
根据建议,使用Python的sqlite3模块写入一个表,其中主键是自动递增的,有一个名为"key"(或"left")的字段和一个称为"value"(或"right")的字段。
然后从MIN(键)和MAX(键)的表中进行SELECT,利用这些信息,您可以按排序顺序选择具有相同"键"(或"左")值的所有行,并将这些信息打印到输出文件中(如果数据库对您来说不是一个好的输出)。
我写这种方法的假设是,你把这个问题称为"大数据",因为键的数量不适合内存(否则,一个简单的Python字典就足够了)。然而,IMHO并没有正确地将这个问题标记为"大数据":为了需要在Hadoop或类似平台上进行分布式计算,您的输入数据应该比单个硬盘中的数据多得多,或者您的计算应该比简单的哈希表查找和插入成本高得多。