Python
為什麼使用 Python 的 openpyxl 模組寫入幾 MB 的工作簿會佔用千兆字節的 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
表明,通過將該小數據集(伺服器上的 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 使用: