我应该使用哪个工具来组合这个大型数据集?

数据挖掘 数据集 大数据
2022-03-02 22:15:06

这是我第一次涉足数据科学,甚至在进行分析之前就遇到了障碍。

我有 40 个 CSV 文件;每个包含 2 列 - 一个时间和值列。

我想通过对所有文件的时间列进行外部连接将其合并到一个表中,以便最终文件包含 1 个时间列和 40 个值列。我尝试使用 pandas 合并方法进行此操作,但我的本地计算机在完成之前内存不足。通过简单地组合 40 个文件中的 8 个文件,我确保代码没有根本性的错误,并得到了预期的结果。

那时我决定在 AWS 上启动一个更强大的云计算实例;我选择了一个内存高得离谱的内存,所以我使用的是 190 GB 而不是 8 GB。它走得更远,但在第 30 个文件附近出现了相同的内存错误。我还应该提到每个文件都有很多行 - 大约 180K。

在那一点上,我决定我必须以错误的方式解决这个问题。我不认为 pandas 是用来组合如此大的数据集的工具。在我的上一份工作中,我非常广泛地使用了 SQL,而且类似的东西似乎更有装备。我的下一个想法是尝试在 AWS Athena 中进行,这是一种类似 SQL 的服务,可以与 S3 中的 csv 文件集成。我认为这个问题没有标准的解决方案,但我只是想看看我是否偏离了基础或朝着正确的方向前进。

谢谢!!

2个回答

我建议尝试分批进行。潜在的问题很可能在某种程度上仍然与内存相关,因为该merge方法会复制其输入,因此根本没有内存效率。

例如,您可以读取 10 个文件,创建所需的输出,就像您已经完成的那样。对文件 10-20、20-30 和 30-40 重复此操作。最后四个您创建的四个文件。这有点烦人,但有时这些小变通办法可以完成工作。


[编辑]

另一种选择可能是在读取过程中使用更多涉及的内存管理chunksize通过pd.read_csv(). 顾名思义,这会将文件的一部分以块的形式读入内存。如果您在循环中执行此操作,则应该对内存使用设置上限。例如(未经测试):

chunksize = 50e6        # 50 Mb

for single_file in list_of_file_paths:
    for i, chunk in enumerate(pd.read_csv(single_file, chunksize=chunksize):
        if i == 0:
            result = chunk
        else:
            result = pd.merge((result, chunk), copy=False, how= ...)

在合并它们之前,您可能需要对各个块做一些事情。

此外,请注意我将copy参数设置mergeFalse,这可能会有所帮助 -文档对于它如何节省内存有点含糊。

使用 Pentaho 数据集成器。Sourceforge下载,解压缩,然后单击spoon.bat(或spoon.sh)。在网上找到一个入门指南,花几分钟学习如何阅读 CSV 文件(一旦知道,就需要点击三下),并询问关于 SOF 上的连接的问题,标记 pentaho。