默认情况下,XlsxWriter 将全部单元格数据保存在内存中,以便支持将格式与数据分开应用的后续功能。因此,创建大型文件时可能消耗大量内存,甚至耗尽内存。
可以通过 Workbook 的 constant_memory 选项,几乎完全消除这种随数据规模增长的内存占用:
workbook = xlsxwriter.Workbook(filename, {'constant_memory': True})
优化方法是:写入下一行后,刷新上一行。因此,工作表在内存中保留的数据量最多约为一行。
因为新行会刷新旧行,启用此模式必须按行顺序写入:
# Ok. With 'constant_memory' you must write data in row by column order.
for row in range(0, row_max):
for col in range(0, col_max):
worksheet.write(row, col, some_data)
# Not ok. With 'constant_memory' this will only write the first column of data.
for col in range(0, col_max):
for row in range(0, row_max):
worksheet.write(row, col, some_data)
另一项优化是不使用 Excel 的“共享字符串”结构,而是将字符串内联写入。这是有文档说明、且多数电子表格应用支持的 Excel 特性。
代价是无法使用写入之后再操作单元格数据的功能。目前 add_table 在此模式下不能使用,merge_range 与 set_row 只对当前行有效。
性能数据
以下数字测量 N 行×50列、字符串与数字各占一半的工作表,来自一台任意选择的中档机器。不同机器数值会变化,但趋势应相同。
普通模式的时间与内存基本随行数线性增长:
| 行数 | 列数 | 时间(秒) | 内存(字节) |
|---|---|---|---|
| 200 | 50 | 0.43 | 2346728 |
| 400 | 50 | 0.84 | 4670904 |
| 800 | 50 | 1.68 | 8325928 |
| 1600 | 50 | 3.39 | 17855192 |
| 3200 | 50 | 6.82 | 32279672 |
| 6400 | 50 | 13.66 | 64862232 |
| 12800 | 50 | 27.60 | 128851880 |
constant_memory 模式的执行时间仍线性增长,但内存保持较小且恒定:
| 行数 | 列数 | 时间(秒) | 内存(字节) |
|---|---|---|---|
| 200 | 50 | 0.37 | 62208 |
| 400 | 50 | 0.74 | 62208 |
| 800 | 50 | 1.46 | 62208 |
| 1600 | 50 | 2.93 | 62208 |
| 3200 | 50 | 5.90 | 62208 |
| 6400 | 50 | 11.84 | 62208 |
| 12800 | 50 | 23.63 | 62208 |
该模式的性能应与普通模式大致相同。上述数据由 XlsxWriter 仓库 dev/performance 目录中的程序生成。
原文:Working with Memory and Performance。© 2013–2025 John McNamara。本文为中文译稿,表格为原文历史测量,不是本次实测。具体许可证待复核;转载依据用户明确授权。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容