Pandas DataFrame的最大大小
我正在尝试使用 panda
的 read_csv
或 read_stata
函数来读取一个比较大的数据集,但我总是遇到 Memory Error
的问题。请问一个数据框(dataframe)最大能有多大?我理解的是,只要数据能放进内存里,数据框就应该没问题,这对我来说应该不是问题。那还有什么其他原因可能导致内存错误呢?
为了让你更明白,我正在尝试读取 2007年消费者财务调查,有ASCII格式(用 read_csv
)和Stata格式(用 read_stata
)。这个文件大约有200MB(dta格式)和1.2GB(ASCII格式),在Stata中打开时告诉我有5800个变量/列和22000个观察值/行。
1 个回答
我将根据评论中的讨论发布这个回答。我发现这个问题出现了很多次,但没有一个被接受的答案。
内存错误很直观,就是内存不够了。但有时候,解决这个错误或者调试它会让人感到沮丧,因为你明明有足够的内存,但错误还是存在。
1) 检查代码错误
这可能是个“傻瓜步骤”,但这就是为什么它排在第一位。确保你的代码里没有无限循环或者那些明显会耗时很长的操作(比如使用 os
模块去搜索整个电脑并把结果放到一个 Excel 文件里)。
2) 让你的代码更高效
这和第一步是相关的。如果一些简单的操作耗时很长,通常会有一个模块或者更好的方法可以更快、更省内存。这就是 Python 和开源语言的魅力所在!
3) 检查对象的总内存
第一步是检查一个对象的内存。关于这个问题,StackOverflow 上有很多讨论,你可以去搜索一下。比较受欢迎的答案可以在 这里 和 这里 找到。
要找出一个对象的大小,你可以使用 sys.getsizeof()
:
import sys
print(sys.getsizeof(OBEJCT_NAME_HERE))
现在,错误可能在任何东西创建之前就发生,但如果你分块读取 CSV 文件,你可以看到每块使用了多少内存。
4) 运行时检查内存
有时候你有足够的内存,但你运行的函数在运行时消耗了大量内存。这会导致内存瞬间飙升,超过了最终对象的实际大小,从而导致代码或进程出错。实时检查内存虽然比较麻烦,但可以做到。Ipython 在这方面表现不错。可以查看 他们的文档。
使用下面的代码可以直接在 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
如果你需要关于魔法函数的帮助,可以参考 这篇很棒的帖子。
5) 这一步可能是第一步……但检查一些简单的东西,比如位数版本
就像你遇到的情况,简单地切换你运行的 Python 版本就解决了问题。
通常以上步骤能解决我的问题。