Python

為什麼使用 Python 的 openpyxl 模組寫入幾 MB 的工作簿會佔用千兆字節的 RAM?

  • August 25, 2022

我在舊伺服器上發現了一個舊程式碼,該程式碼使用 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表明,通過將該小數據集(伺服器上的 20 MB)寫入 Excel,所有可用的 3.5 GB 都已被使用。

我在執行時檢查了它,發現: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 工作簿會佔用千兆字節的 RAM?

眾所周知,openpyxl 需要大量 RAM 來讀取/寫入 Excel 文件:

根據關於性能的 openpyxl 文件,可以通過這種方式計算一般 RAM 使用量。

與其他庫和應用程序相比,記憶體使用率相當高,大約是原始文件大小的 50 倍,例如 50 MB Excel 文件需要 2.5 GB。

在您的情況下,該值似乎更高,可能是您的用法不同或文件中的值已過時。

但文件還包含如何優化的提示,從而減少 RAM 使用:

  1. 安裝 Python 包lxml - 如果安裝了該包,它將被使用。特別推薦在編寫“大”Excel 文件時使用。
  2. 使用只寫模式

引用自:https://serverfault.com/questions/1109013