为什么使用 Python 的 openpyxl 模块写入几 MB 的工作簿会占用 GB 的 RAM?

为什么使用 Python 的 openpyxl 模块写入几 MB 的工作簿会占用 GB 的 RAM?

我在旧服务器上找到一个旧代码,它使用 openpyxl 将大约 20 列和超过 60K 行的数据集逐项写入 Excel 文件。它通过自己填充每个单元格来实现这一点(这种方式很慢,但也不是那么慢,因为整个过程在几分钟内完成,并且格式化了单元格):

cell = ws.cell('%s%s' % (col_idx, i + 3))
cell.value = unicode(value).encode("utf-8")
get_style(cell, "content", column_colors[col_id])

在大约 59K 行时,它崩溃了,控制台打印:

Killed

日志显示:

Received SIGTERM, shutting down.

SIGTERM 提示内存太少,因此服务器“从外部”终止任务。它是一台虚拟机。使用命令检查内存free显示,所有可用的 3.5 GB 都用于将该小数据集(服务器上为 20 MB)写入 Excel。

我在运行时检查了一下,发现:仅配置文件就需要 500 MB,每 10K 行需要 700 MB。写入数据集导致:

需要 60 x 700 + 500 = 4700 MB 可用 RAM,而 VM 只有 3.5 GB。无论如何,对于输出中这么小的文件来说,这应该足够了。最终的输出大约是一个 20 MB 的工作簿。输出 Excel 版本应该是 2007 或 2010,因为它运行在 Python 2.73 上,并且使用了过时的遗留代码。

为什么使用 Python 的 openpyxl 模块写入 20 MB 的工作簿会占用 GB 的 RAM?

答案1

众所周知,openpyxl 需要大量 RAM 来读取/写入 Excel 文件:

根据openpyxl 有关性能的文档一般的 RAM 使用情况可以通过这种方式计算。

与其他库和应用程序相比,内存使用率相当高,大约是原始文件大小的 50 倍,例如 50 MB 的 Excel 文件占用 2.5 GB。

在您的情况下,该值似乎甚至更高,可能是您的用法不同或文档中的值已过时。

但文档还包含提示如何优化,从而减少 RAM 使用量:

  1. 安装 Python 包xml文件- 如果安装了该包,它将被使用。在编写“大型”Excel 文件时特别推荐使用。

  2. 使用只写模式

相关内容