花生他爸 2022-04-14 15:11 采纳率: 33.3%
浏览 44
已结题

python xlsxwriter constant_memory开启后内存使用并未优化

问题遇到的现象和发生背景

使用xlsxwriter写入大数据量发现内存占用大,搜索得知constant_memory参数开启可以优化内存使用。但是实际开启后未优化

问题相关代码
Write_Excle是二次封装的写xlsx的类
xlsxwriter.Workbook(filename, {'constant_memory': True})
    def write_cell(self, row, col, data, color='#ffffff'):
        format = self.Workbook.add_format()
        format.set_pattern(1)
        format.set_bg_color(color)
        self.worksheet.write(row, col, data, format)

#以下是循环写excle代码
self.write_excle = Write_Excle(result_file_name)
nrows = self.read_excle.nrows_out()  # 行数
ncols = self.read_excle.ncols_out()  # 列数
for row in range(0, nrows):
  self.write_excle.write_cell(row, 0, file_type+'[%d]' % (row+1), default_color)
  for col in range(0, ncols):
      cell_info = self.read_excle.get_cell_data(row, col)
      self.write_excle.write_cell(row, col + 1, cell_info, default_color)
问题已解决

问题原因:
是写法问题导致的内存过大。过大原因是每次调用write_cell方法都创建一个format = self.Workbook.add_format()格式,导致大量占用内存。
解决方法:
class内部创建一个format_dict用于存放使用过的单元格格式,相同的格式不重复创建,大大减少内存使用。

class Write_Excle():

    def __init__(self, filename):
        '''
        index是excle表格所在目录;
        sheet_id是要查找数据在哪个sheet表单中
        '''
        # self.index = index.decode('utf8')
        self.filename = filename
        self.Workbook = xlsxwriter.Workbook(filename, {'constant_memory': True})
        self.worksheet = self.Workbook.add_worksheet()
        self.format_dict = {}

    def write_cell(self, row, col, data, color='#ffffff'):
        if data in [('\x00', str), '\x00', ('\x00\x00', str), '\x00\x00', ]:
            data = ''
        if color != '#ffffff':
            if color not in self.format_dict:
                self.format_dict[color] = self.Workbook.add_format()
                self.format_dict[color].set_bg_color(color)
            self.worksheet.write(row, col, data, self.format_dict[color])
        else:
            self.worksheet.write(row, col, data)

    def write_row(self, row, col, data_list):
        '''写入一整行数据'''
        self.worksheet.write_row(row, col, data_list)

    def close_excle(self):
        self.Workbook.close()

  • 写回答

1条回答 默认 最新

  • 不会长胖的斜杠 后端领域新星创作者 2022-04-14 15:13
    关注

    一般都用csv库来写,可以试试csv库

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月15日
  • 修改了问题 6月15日
  • 修改了问题 6月15日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题