我正在尝试使用panda
s read_csv
或read_stata
函数读取一个有点大的数据集,但我一直在使用Memory Error
s。数据帧的最大大小是多少?我的理解是,只要数据适合内存,数据帧就应该没问题,这对我来说应该不是问题。还有什么可能导致内存错误?
对于上下文,我试图用Survey of Consumer Finances 2007读取ASCII格式(使用read_csv
)和Stata格式(使用read_stata
)。该文件大约为200MB作为dta,大约1.2GB作为ASCII,并且在Stata中打开它告诉我,有2200个观察/行有5,800个变量/列。
答案 0 :(得分:15)
我将按照评论中的讨论发布这个答案。我已经看过很多次没有得到接受的答案。
内存错误很直观 - 内存不足。但有时候这个错误的解决方案或调试是令人沮丧的,因为你有足够的内存,但错误仍然存在。
1)检查代码错误
这可能是一个“愚蠢的步骤”,但这就是为什么它是第一个。确保没有无限循环或有意识地花费很长时间的东西(比如使用os
模块来搜索整个计算机并将输出放在excel文件中)
2)提高您的代码效率
沿着第1步的路线前进。但是如果事情需要花费很长时间,那么通常会有一个模块或更好的方法来做更快,更有效的事情。这就是Python和/或开源语言的美妙之处!
3)检查对象的总内存
第一步是检查对象的内存。 Stack上有大量关于此的线程,因此您可以搜索它们。热门答案为here和here
要查找咬合中对象的大小,您始终可以使用sys.getsizeof()
:
import sys
print(sys.getsizeof(OBEJCT_NAME_HERE))
现在错误可能在创建任何内容之前发生,但如果您以块的形式读取csv,则可以看到每个块使用了多少内存。
4)运行时检查内存
有时你有足够的内存,但你运行的功能在运行时会占用大量内存。这会导致内存超出最终对象的实际大小,从而导致代码/进程出错。实时检查内存很长,但可以完成。 Ipython很好。检查Their Document。
使用下面的代码直接在Jupyter Notebook中查看文档:
%mprun?
%memit?
样品使用:
%load_ext memory_profiler
def lol(x):
return x
%memit lol(500)
#output --- peak memory: 48.31 MiB, increment: 0.00 MiB
如果您需要有关魔术功能的帮助This is a great post
5)这可能是第一个....但检查比特版本之类的简单事情
在您的情况下,您正在运行的python版本的简单切换解决了这个问题。
通常上述步骤可以解决我的问题。