Csv 在非常大的数据集上执行联接
我已经收到几个CSV文件,我需要合并成一个文件,所有这些文件都有一个公共密钥,我可以用来加入它们。不幸的是,这些文件的大小都大约为5GB(几百万行,大约20-100+列),因此将它们加载到内存中并对每个文件执行联接是不可行的,但我知道我不必担心它们之间存在的列冲突 我尝试为每个ID对应的文件创建一个行索引,这样我就可以在不使用太多内存的情况下计算结果,但当然,当实际尝试查找每一行时,这会随着时间的推移而变慢,从该行中提取剩余的CSV数据,将其连接到进行中的数据,然后写入文件。即使在SSD上,针对每个文件中的数百万行进行处理也是不可行的 我还尝试在内存中加载一些较小的集合,并对它们运行parallel.foreach,以匹配必要的数据以转储回临时合并文件。虽然这比上一种方法快,但我没有足够的内存来处理较大的文件 理想情况下,我只想对最大的文件执行完全左连接,然后对随后的每个较小的文件执行完全左连接,以便所有文件都合并 否则我如何着手解决这个问题?我在这个系统上有24 gb的内存可供使用,还有6个内核可供使用 虽然这可能只是在关系数据库中加载并从那里进行连接的一个问题,但我想在走这条路之前,我应该先联系一下,看看是否有任何想法可以从我的本地系统中解决这个问题Csv 在非常大的数据集上执行联接,csv,join,bigdata,Csv,Join,Bigdata,我已经收到几个CSV文件,我需要合并成一个文件,所有这些文件都有一个公共密钥,我可以用来加入它们。不幸的是,这些文件的大小都大约为5GB(几百万行,大约20-100+列),因此将它们加载到内存中并对每个文件执行联接是不可行的,但我知道我不必担心它们之间存在的列冲突 我尝试为每个ID对应的文件创建一个行索引,这样我就可以在不使用太多内存的情况下计算结果,但当然,当实际尝试查找每一行时,这会随着时间的推移而变慢,从该行中提取剩余的CSV数据,将其连接到进行中的数据,然后写入文件。即使在SSD上,针对
谢谢 首先想到的是关系数据库,而且可能是最简单的,但除此之外 构建哈希表,将密钥映射到文件偏移量。在加入时按需分析行。如果您的键空间仍然太大,无法容纳可用的地址空间,您也可以将其放入文件中。这正是数据库索引所要做的(尽管可能使用b-树)
您还可以根据文件的键对文件进行预排序并进行合并联接。首先想到的是关系数据库,这可能是最简单的,但除此之外 构建哈希表,将密钥映射到文件偏移量。在加入时按需分析行。如果您的键空间仍然太大,无法容纳可用的地址空间,您也可以将其放入文件中。这正是数据库索引所要做的(尽管可能使用b-树)
您还可以根据文件的键对文件进行预排序并进行合并联接。我不确定您是否在处理数据。但是如果只是结合csv,你可以试试这个。。。
我不确定您是否在操纵数据。但是如果只是结合csv,你可以试试这个。。。 好消息是,“几个”5GB文件并不是一个巨大的数据量。我知道这是相对的,但是你描述你的系统的方式…我仍然认为这没什么大不了的。如果不需要加入,可以使用Perl或其他一些命令行工具 每个文件中的列名都是已知的吗?你关心列名吗 我的第一个想法:
不幸的是,我需要根据密钥(谢天谢地,在所有文件的第一列中)连接它,所以我不能简单地连接所有内容,但谢谢!不幸的是,我需要根据密钥连接它(谢天谢地,它位于所有文件的第一列),所以我不能简单地连接所有内容,但谢谢!