eti*_*ier 4 python dataframe pandas
具体来说,我最近不得不使用大型数据集(~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
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为当我运行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
Run Code Online (Sandbox Code Playgroud)
同样,这很奇怪,因为它的内存使用量达到了 ~1.5 GB,但是输出为 ~3 GB 的文件提供了 4.9 GB 的内存使用量。
我猜 Python 不会将一段时间未使用的内容保留在内存中,但我很好奇这里的规则是什么?这是如何运作的?这是 Pandas 的内存管理过程,还是 Python 的内存管理过程?
操作系统的虚拟内存子系统可能会调出一段时间未使用的内存。使用memory_usage='deep'需要 Pandas 扫描所有这些对象,因此它们会被重新分页,这会导致进程的驻留内存使用量增加。这就是为什么这很慢,它必须从磁盘读取大量信息。
该文件解释了使用时的不同deep选项:
在没有深入内省的情况下,基于列 dtype 和行数进行内存估计,假设值对相应的 dtype 消耗相同的内存量。通过深度内存自省,以计算资源为代价执行真实的内存使用计算。
不管有没有这个选项,它都会报告虚拟内存的数量,无论是精确估计还是计算。任务管理器中报告的内存使用量增加只是计算精确数量过程的副作用。
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |