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