我正在将两个数据帧合并在一起。它们最初是.csv
个文件,每个文件只有7兆字节(2列和290,000行)。我这样合并:
merge=pd.merge(df1,df2, on=['POINTID'], how='outer')
在32位Anaconda中我得到了:
ValueError: negative dimensions are not allowed
但是在64位Anaconda上我收到内存错误。
我有12 GB的RAM,只有30%的RAM被使用,所以它不应该是内存问题。我在另一台计算机上试过并遇到同样的问题。
答案 0 :(得分:6)
在32位计算机上,默认的NumPy整数dtype为int32
。
在64位计算机上,默认的NumPy整数dtype为int64
。
int32
和int64
代表的最大整数是:
In [88]: np.iinfo('int32').max
Out[88]: 2147483647
In [87]: np.iinfo('int64').max
Out[87]: 9223372036854775807
因此,pd.merge
创建的整数索引将在32位计算机上支持最多2147483647 = 2**31-1
行,在64位计算机上支持9223372036854775807 = 2**63-1
行。
理论上,与outer
联接合并的两个290000行DataFrame可能有290000**2 = 84100000000
行。由于
In [89]: 290000**2 > np.iinfo('int32').max
Out[89]: True
32位机器可能无法生成足以索引合并结果的整数索引。
虽然64位机器理论上可以生成足够大的整数索引来容纳结果,但是你可能没有足够的内存来构建一个840亿行的DataFrame。
现在,当然,合并的DataFrame可能少于840亿行(具体数量取决于df1['POINTID']
和df2['POINTID']
中出现的重复值的数量),但上面的后面是信封计算表明,您所看到的行为与大量重复行为一致。
PS。如果存在算术溢出,则在NumPy数组中添加或乘以正整数时可以得到负值:
In [92]: np.int32(290000)*np.int32(290000)
Out[92]: -1799345920
我的猜测是这是异常的原因:
ValueError: negative dimensions are not allowed