为什么一段时间后Python内存使用量下降?

时间:2019-08-15 20:20:02

标签: python pandas dataframe

特别是,我最近不得不处理一个大型数据集(约3 GB),并且为了了解加载过程的速度(即运行df = pd.read_csv(file)),我打开了一个任务管理器。

如我所见,我看到我的Python进程的内存使用量不断上升。大约达到3 GB时,它已满载。符合逻辑。

然后,在执行了一些其他不涉及Python的任务之后,比如说答复电子邮件或在线浏览,我注意到任务管理器中的Python内存使用率下降了,好像我还没有加载任何数据一样。但是我仍在运行笔记本的内核(在那里没有中断)。

奇怪的是,即使在降低内存使用量之后,我的代码仍然可以正常工作:我可以通过运行以下示例显示数据框中的信息:

df.loc[100000:101000,['col1','col2','col3']]

可立即显示这1000行。

或者如果我跑步:

df.info()

这给了我这个

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3228691 entries, 0 to 3228690
Columns: 117 entries, first_column to last_column
dtypes: category(49), float64(51), object(17)
memory usage: 1.8+ GB

这很奇怪,因为当我运行df.info(memory_usage='deep')而不是仅仅运行df.info()时,它花费的时间要长得多,而且我可以在任务管理器中看到Python进程的内存使用率一直上升到达到约1.5 GB。输出如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3228691 entries, 0 to 3228690
Columns: 117 entries, first_column to last_column
dtypes: category(49), float64(51), object(17)
memory usage: 4.9 GB

同样,这很奇怪,因为它达到了〜1.5 GB的内存使用量,但是随后输出为大约3 GB的文件提供4.9 GB的内存使用量。

我想Python不会在内存中保留一段时间以来未使用的内容,但是我很好奇这里的规则是什么?这是如何运作的?这是Pandas的内存管理流程,还是Python的内存管理流程?

1 个答案:

答案 0 :(得分:4)

操作系统的虚拟内存子系统可能会调出一段时间未使用的内存。使用memory_usage='deep'要求Pandas扫描所有这些对象,以便它们重新分页,这会导致进程的常驻内存使用量增加。这就是为什么它很慢,它必须从磁盘读取大量信息。

documentation解释了使用deep选项时的区别:

  

在不进行深入自省的情况下,将基于列dtype和行数(假定值为相应的dtype消耗相同的内存量)进行内存估计。借助深度内存自省,可以以计算资源为代价执行实际内存使用量计算。

使用或不使用此选项,它都会报告虚拟内存的数量,无论是精确估算还是计算得出。任务管理器中报告的内存使用增加只是计算精确量过程的副作用。