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
によって作成された整数インデックスが64で32ビットマシン上2147483647 = 2**31-1
行、及び9223372036854775807 = 2**63-1
行の最大をサポートしますビットマシン。
理論では、outer
とマージされた2つの290000行のデータフレームには、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
あなたはそれを試すことができますサンプル? ''外側 ''で '' POINTID ''、 '= 'POINTID' ')の' 'df1 [:100]、df2 [:100] – ayhan
は動作しますが、これよりも大きなファイルを一緒に結合しても問題はありませんでした。 –
結果は期待通りですか?マージしているときに、多くのNaNを導入する整列の問題が生じることがあります。だから私はそれが記憶上の問題かもしれないと言いました。 – ayhan