问题遇到的现象和发生背景
使用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()