大数据文件:读取和创建结构化文件

时间:2014-04-09 16:25:43

标签: python c++ file-io dataset bigdata

我有一个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 ++中编写脚本来加载文件,创建长字符串,并逐行写入文件。然而,似乎两种语言都无法处理手头的任务。有没有人对如何解决这个问题有任何建议?具体来说,有一个特定的方法/程序是最佳的吗?任何帮助或指导的指示将不胜感激。

4 个答案:

答案 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)

  1. 打开每个密钥的输出文件。
  2. 迭代源文件的行,将值附加到输出文件中。
  3. 加入输出文件。

答案 3 :(得分:0)

还发现了一个有趣的想法on Stack Overflow

  

如果你想坚持一本大字典,你基本上是在看一个数据库。

根据建议,使用Python的sqlite3模块写入主键自动递增的表,其中包含一个名为“key”(或“left”)的字段和一个名为“value”(或“right”)的字段

然后从表中选择MIN(键)和MAX(键),使用该信息,您可以按排序顺序选择具有相同“键”(或“左”)值的所有行,并将这些信息打印到outfile(如果数据库不是一个好的输出)。

我假设您将此问题称为“大数据”,因为密钥数量不适合内存(否则,简单的Python字典就足够了)。但是,恕我直言这个问题没有被正确地标记为“大数据”:为了要求在Hadoop或类似的地方进行分布式计算,你的输入数据应该远远超过你在单个硬盘中可以容纳的数量,或者你的计算应该是多少比简单的哈希表查找和插入更昂贵。