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