关于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的范围内。

posted @ 2023-01-17 21:18  yafeile  阅读(17)  评论(0编辑  收藏  举报