【Python】大型数据集写入excel

当处理大型数据集写入Excel时,内存不足的问题可以通过以下方法解决:

方法一:分块写入并直接使用xlsxwriter

绕过pandas,直接使用xlsxwriter逐行或逐块写入数据,避免创建大型DataFrame对象。

import xlsxwriter

# 创建Excel文件和工作表
workbook = xlsxwriter.Workbook('large_data.xlsx')
worksheet = workbook.add_worksheet()

# 假设data是可迭代的二维数据(如列表的列表)
for row_num, row_data in enumerate(data):
    worksheet.write_row(row_num, 0, row_data)

workbook.close()

方法二:分块生成数据并写入

如果数据能分块生成或读取,逐块处理以减少内存峰值。

import xlsxwriter

def data_chunks(data, chunk_size):
    # 分块生成数据
    for i in range(0, len(data), chunk_size):
        yield data[i:i + chunk_size]

workbook = xlsxwriter.Workbook('output.xlsx')
worksheet = workbook.add_worksheet()

row_num = 0
chunk_size = 10000  # 调整块大小以适应内存
for chunk in data_chunks(data, chunk_size):
    for row_data in chunk:
        worksheet.write_row(row_num, 0, row_data)
        row_num += 1
    del chunk  # 及时释放内存

workbook.close()

方法三:优化数据类型并分块写入DataFrame

使用pandas时,优化数据类型并分块写入不同工作表。

import pandas as pd

chunk_size = 10000
with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
    for i, start in enumerate(range(0, len(data), chunk_size)):
        chunk = data[start:start + chunk_size]
        df = pd.DataFrame(chunk).astype('float32')  # 优化数据类型
        df.to_excel(writer, sheet_name=f'Sheet{i+1}', index=False)

方法四:转换为CSV再转Excel(间接方法)

若允许中间步骤,先写入CSV再转换为Excel。

import pandas as pd

# 分块写入CSV
csv_file = 'temp.csv'
chunk_size = 10000
for i in range(0, len(data), chunk_size):
    chunk = pd.DataFrame(data[i:i+chunk_size])
    chunk.to_csv(csv_file, mode='a', index=False, header=False)

# 将CSV转换为Excel
pd.read_csv(csv_file).to_excel('final.xlsx', index=False)

总结

  • 直接使用xlsxwriter:避免pandas内存开销,逐行写入。
  • 分块处理:无论是否使用pandas,分块处理数据以减少单次内存占用。
  • 优化数据类型:使用更紧凑的数据类型(如float32代替float64)。
  • 系统调整:确保运行环境有足够内存或交换空间。

根据数据来源和格式选择最适合的方法,优先考虑直接操作Excel的低层库(如xlsxwriter)以最大化内存效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值