关于xlsxwriter内存占用暴增的问题
最近1个同事使用Python的xlsxwriter库生成表格数据,结果数据量在1W的时候内存直接占用到了1.75G。
后来帮助排查后发现是xlsxwriter这个库的问题,其中的Workbook对象的add_format
的代码如下:
def add_format(self, properties=None):
"""
Add a new Format to the Excel Workbook.
Args:
properties: The format properties.
Returns:
Reference to a Format object.
"""
format_properties = self.default_format_properties.copy()
if self.excel2003_style:
format_properties = {'font_name': 'Arial', 'font_size': 10,
'theme': 1 * -1}
if properties:
format_properties.update(properties)
xf_format = Format(format_properties,
self.xf_format_indices,
self.dxf_format_indices)
# Store the format reference.
self.formats.append(xf_format)
return xf_format
其中self.formats
是1个列表,每次调用时都添加1个Format
类的实例,如果有1W行则会添加1W个样式的实例,从而造成内存占用比较大。而正常情况下,对于1W条数据,其实重复的样式应该不超过其列的数量。
而解决方法也很简单,就是判断对应的样式是否已经添加,如果已经添加则返回对应的样式实例,否则再进行添加。
这样,就将1W个样式所缩减为十来个或者几个样式了。从而将内存降低到100-200M的范围内。