加入两个巨大的文件,而不会与熊猫分块

时间:2019-06-11 14:07:45

标签: python pandas join chunks

我有带有“ id,name”的File1和带有“ id,address”的File2。我无法加载第一个文件(小于2Gb):它在76k行(带有大块concat)并且只有2列后崩溃……我也无法在第二个文件上读取read_csv,因为它在加载某些行后使内核崩溃。

我需要用“ id”将File1和File2连接起来,但是如果我不能将文件放在dataframe变量中,我不知道该怎么做...

该文件只有5Gb,具有3000万行,但是在加载几秒钟后就会使内核崩溃。

请问如何在没有数据框架的情况下加入文件?

我尝试过卡盘,但是会崩溃。

chunks = []
cols = [...]
for chunk in pd.read_csv("file2.csv", chunksize=500000, sep=',', error_bad_lines=False, low_memory=False, usecols=cols):
    chunks.append(chunk)
df = pd.concat(chunks, axis=0)
print(f.shape)

如果可能,我需要加载数据框以加入它们或加入文件而不加载

2 个答案:

答案 0 :(得分:2)

您逐块读取df2块,但是由于您附加了所有块,因此生成的块与file2的大小相同。

如果能够完全加载df1,您可以做的就是像这样逐个加入df2块:

for chunk in pd.read_csv("file2.csv", chunksize=500000, sep=',', error_bad_lines=False, low_memory=False, usecols=cols):
    df1.merge(chunk, on =['id'], how='left')

答案 1 :(得分:0)

那样的压缩肯定仍会使您的内核崩溃,因为您仍在尝试将所有内容装入内存。您需要对块进行一些操作以减小其大小。

例如,您可以成块读取两个文件,将每个块连接在一起,将匹配项输出到另一个文件,然后将不匹配的ID保留在内存中。如果不幸,那仍然可能使内核崩溃。这取决于您的性能约束,以及之后需要处理的数据。