使用openpyxl将一个大矩阵写入excel,它会抛出一个memery错误

时间:2015-04-30 02:04:50

标签: python openpyxl

These days I use the openpyxl to write the large excel data.

数据包含3000行和3000列。我使用openpyxl的optimized writer将这个大矩阵写入excel,但它会抛出记忆错误。 我写的详细信息如下:

def write_xlsx_file(paths):
   file_name = 'statis_block_base_info_.xlsx'
   #print 'write the ' + str(month) + ' file:' + file_name

    wb = Workbook(write_only = True)

    path_ws = wb.create_sheet(0)
    path_ws.title = 'path_links'

    paths_row = len(paths)
    for i in xrange(0, paths_row):
       path_ws.append(paths[i])

    wb.save(file_name)

2 个答案:

答案 0 :(得分:1)

如果您收到内存错误,那么这可能意味着您的工作表中包含许多唯一字符串。在只写模式下,openpyxl会逐行序列化每一行,而3000个单元格不会占用大量内存。但是,字符串保存在中央字典中,在写入所有单元格之前无法序列化。但这应该只是在几乎每个单元格中都有不同的字符串的情况。如果是这种情况,则使用openpyxl的唯一解决方案是更多内存。

这是否描述了您的情况?使用了多少内存?其他库如xlsxwriter通过将字符串直接序列化为子对象来解决这个问题。所以你可能想尝试使用“常量内存”模式。

答案 1 :(得分:1)

如果您需要使用openpyxl转储大量数据,只有使用val nextWeekDate = udf {(startDate: DateType) => val day= date_format(startDate,'E' if(day=='Sat' or day=='Sun'){ nextWeekDate = next_day(startDate,'Mon') } else{ nextWeekDate = date_add(startDate, 1) } } 选项无效,如openpyxl文档中所述,您需要安装lxml。

对我来说,安装lxml后,内存消耗从4GB以上减少到不足100MB

openpyxl文档(搜索lxml,你会发现建议):https://openpyxl.readthedocs.io/en/latest/optimized.html

使用pip安装lxml:

write_only=True