值错误:合并时不允许使用负尺寸

时间:2016-08-24 18:35:17

标签: python pandas

我正在将两个数据帧合并在一起。它们最初是.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被使用,所以它不应该是内存问题。我在另一台计算机上试过并遇到同样的问题。

1 个答案:

答案 0 :(得分:6)

在32位计算机上,默认的NumPy整数dtype为int32。 在64位计算机上,默认的NumPy整数dtype为int64

int32int64代表的最大整数是:

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