XlsxWriter 的内存与性能

默认情况下,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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容