Pandas数据框的最大大小是多少?

46

我正在尝试使用 pandasread_csvread_stata 函数读取一个相当大的数据集,但我一直遇到 Memory Error。数据框架的最大大小是多少?我的理解是只要数据适合内存,数据框架就应该没问题,这对我来说不应该是个问题。还有什么原因会导致内存错误呢?

为了更好地理解情况,我正在尝试读取2007年消费者财务调查,它既可以使用 ASCII 格式(使用 read_csv),也可以使用 Stata 格式(使用 read_stata)。文件大小约为 200MB,以 dta 格式呈现,以 ASCII 格式呈现则约为 1.2GB,在 Stata 中打开后,告诉我有 5,800 个变量/列和 22,000 个观测/行。


2
可能是 https://dev59.com/aGgu5IYBdhLWcg3wDS0G 的重复问题可以参考一下。 - MCP_infiltrator
10
你正在运行32位的Python吗? - Jeff
4
我曾经读过csv版本和dta版本的文档,两个版本在64位的Python/pandas 0.13.1环境下都能正常工作。csv文件的峰值内存使用量为3.33G,而dta文件则为3.29G。这个内存使用量接近32位版本可能会卡壳的范围。所以@Jeff的问题是非常好的。 - Karl D.
这是一个适用于32位操作系统的回答:https://dev59.com/0H7aa4cB1Zd3GeqPwu6K#23207756 - Jeff
10
谢谢Jeff和Karl,我之前确实不知道自己在使用32位的Python,现在已经切换到了64位,程序运行得非常好! - Nils Gudat
4
@Jeff或KarlD。你应该将这个问题发布为答案,这样未来发现它的人就知道它有一个答案,不必查看评论部分。 - André C. Andersen
1个回答

47

根据评论的讨论,我将发布此答案。我已经看到这个问题多次出现,但没有被接受的答案。

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

1)检查代码错误

这可能是一个“愚蠢的步骤”,但这就是为什么它首先出现的原因。确保没有无限循环或明知需要很长时间的操作(例如使用会搜索整台计算机并将输出放入Excel文件中的os模块)。

2)使代码更有效率

与步骤1相似。但如果某些简单的任务需要很长时间,通常有一个更快且更节省内存的模块或方法来完成同样的任务。这就是Python和/或开源语言的美妙之处!

3)检查对象的总内存

第一步是检查对象的内存。关于这个问题,在Stack上有很多线程,所以你可以搜索它们。流行的答案在这里这里

要找到对象的大小,您可以始终使用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版本就可以解决问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接