【发布时间】:2018-03-19 22:21:23
【问题描述】:
在 Python 3.6.4 中使用 df.duplicated() 检查数据框中的重复项时,我得到了一个 MemoryError: cannot allocate memory for array。
df 有大约 150,000 行和 208 列,将数据加载到 df 中没有问题(使用下面的块)。
myList = []
for chunks in pd.read_csv(filename, header=0, low_memory=False, chunksize=20000):
myList.append(chunks)
dfMain = pd.concat(myList, axis=0)
dfMain.index.name = 'Index'
print (dfMain.shape)
Out: (151982, 208)
到目前为止一切都很好。
#Marks duplicated rows with TRUE or FALSE and put into a new df
dfDup1 = pd.DataFrame(dfMain.duplicated(keep=False)) #set to False to view all duplicates
这是发生错误的地方:MemoryError: cannot allocate memory for array 并且脚本停止。
不幸的是,减少列数不是一种选择,我需要检查所有变量中的重复项(尽管我确实删除了 150 个变量进行测试,但问题仍然存在)。而且我确实需要将重复的值导出到 df/csv,所以在这个阶段不能使用drop_duplicates()。
计算机有大量 RAM(64 gigs),但 Python/pandas 只使用了其中的一小部分。
任何帮助将不胜感激。
【问题讨论】:
-
您是否检查过是否有足够的内存来制作 df 的副本? (我认为 应该 存在,但这可以排除一些不太可能但易于修复的问题,例如“哎呀,我正在运行 32 位 Python”。)
-
@abarnert - 有足够的硬盘空间,但刚刚检查过 - 这台计算机正在运行 32 位 Python。计算机在几周前被重新格式化,不知何故最终变成了 32 位版本。易于修复和忽略!谢谢,将安装 64 位并重试。
-
哈,这就是为什么我总是测试那些不可能出错的愚蠢的东西,除非我是个白痴——因为有一半的时间,我是个白痴。 :)
-
(另外,我注意到您的 df 似乎应该占用 2GB 左右,这对于 64GB 的 RAM 不会有问题……除了 32 位 Python 只能访问 2- 4GB 的 RAM。)
-
再次感谢,abrnert!刚刚重新安装了 64 位,效果很好。
标签: python python-3.x pandas memory