当处理大型数据集写入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)以最大化内存效率。