关于python:pandas数据帧的最大大小

Maximum size of pandas dataframe

我试图用pandaread_csvread_stata函数读取一个稍大的数据集,但我一直在使用Memory Error函数。数据帧的最大大小是多少?我的理解是数据帧应该是正常的,只要数据适合内存,这对我来说应该不是问题。还有什么可能导致内存错误?

就上下文而言,我试图在2007年的消费者金融调查中阅读,包括ASCII格式(使用read_csv)和stata格式(使用read_stata)。这个文件大约200MB作为DTA,大约1.2GB作为ASCII,在stata中打开它会告诉我有5800个变量/列用于22000个观察/行。


我将发表评论中讨论过的答案。我见过很多次没有一个公认的答案。

内存错误是直观的-内存不足。但是,有时这个错误的解决方案或调试会令人沮丧,因为您有足够的内存,但是错误仍然存在。

1)检查代码错误

这可能是"愚蠢的一步",但这就是为什么它是第一步。确保不存在无限循环或有意花费很长时间的事物(例如使用os模块搜索整个计算机并将输出放在Excel文件中)。

2)提高代码效率

按照步骤1的顺序进行。但如果简单的事情需要很长时间,通常会有一个模块或者更好的方法来做一些更快、更有效的记忆。这就是Python和/或开源语言的魅力所在!

3)检查对象的总内存

第一步是检查对象的内存。关于这一点,栈中有很多线程,所以您可以搜索它们。热门答案在这里和这里

要在咬伤中找到物体的大小,可以始终使用sys.getsizeof()

1
2
import sys
print(sys.getsizeof(OBEJCT_NAME_HERE))

现在,错误可能在创建任何内容之前发生,但是如果您以块的形式读取csv,您可以看到每个块使用了多少内存。

4)运行时检查内存

有时您有足够的内存,但运行的函数在运行时会消耗大量内存。这会导致内存峰值超过完成对象的实际大小,从而导致代码/进程出错。实时检查内存很长,但可以完成。伊普生很擅长这个。检查他们的文件。

使用下面的代码直接查看Jupyter笔记本中的文档:

1
2
%mprun?
%memit?

样品使用:

1
2
3
4
5
%load_ext memory_profiler
def lol(x):
    return x
%memit lol(500)
#output --- peak memory: 48.31 MiB, increment: 0.00 MiB

如果你需要魔法功能方面的帮助,这是一个很好的帖子

5)这个可能是第一个……但是检查一些简单的东西,比如位版本

与您的情况一样,运行的Python版本的简单切换解决了这个问题。

通常上述步骤可以解决我的问题。