内存管理¶
本页面介绍如何管理内存以处理大型Excel文件。
内存优化模式¶
使用内存优化工作簿¶
from symphra_excel.utils import MemoryOptimizedWorkbook
with MemoryOptimizedWorkbook() as wb:
sheet = wb.create_worksheet("大数据")
for row in range(1, 100001):
sheet.set_cell_value(f"A{row}", f"Row {row}")
wb.save("large_file.xlsx")
流式写入¶
按块写入数据¶
from symphra_excel.utils import MemoryManager
manager = MemoryManager()
with manager.create_workbook() as wb:
sheet = wb.create_worksheet("流式数据")
chunk_size = 10000
for chunk_start in range(1, 100001, chunk_size):
chunk_end = min(chunk_start + chunk_size, 100001)
for row in range(chunk_start, chunk_end):
sheet.set_cell_value(f"A{row}", f"Data {row}")
manager.flush()
wb.save("streamed_data.xlsx")
内存监控¶
检查内存使用¶
from symphra_excel.utils import MemoryManager
manager = MemoryManager()
print(f"当前内存使用: {manager.get_memory_usage()} MB")
threshold_mb = 100
if manager.get_memory_usage() > threshold_mb:
manager.clear_cache()
完整示例¶
示例: 处理百万行数据¶
from symphra_excel.utils import MemoryOptimizedWorkbook, MemoryManager
from symphra_excel.styles import CellStyle
manager = MemoryManager()
with MemoryOptimizedWorkbook() as wb:
sheet = wb.create_worksheet("百万行")
header_style = CellStyle()
header_style.set_font(bold=True)
header_style.set_background_color("#E0E0E0")
headers = ["ID", "名称", "数值"]
for col_idx, header in enumerate(headers, start=1):
cell = f"{chr(64+col_idx)}1"
sheet.set_cell_value(cell, header)
sheet.apply_style(cell, header_style)
chunk_size = 10000
total_rows = 1000000
for chunk_start in range(2, total_rows + 2, chunk_size):
chunk_end = min(chunk_start + chunk_size, total_rows + 2)
for row in range(chunk_start, chunk_end):
sheet.set_cell_value(f"A{row}", row - 1)
sheet.set_cell_value(f"B{row}", f"Item {row - 1}")
sheet.set_cell_value(f"C{row}", (row - 1) * 100)
manager.flush()
if manager.get_memory_usage() > 500:
manager.clear_cache()
wb.save("million_rows.xlsx")
最佳实践¶
✅ 推荐做法¶
from symphra_excel.utils import MemoryOptimizedWorkbook, MemoryManager
manager = MemoryManager()
with MemoryOptimizedWorkbook() as wb:
sheet = wb.create_worksheet("数据")
chunk_size = 10000
for i in range(0, 1000000, chunk_size):
for row in range(i, min(i + chunk_size, 1000000)):
sheet.set_cell_value(f"A{row}", row)
manager.flush()
manager.clear_cache()
❌ 避免的做法¶
from symphra_excel import Workbook
wb = Workbook()
sheet = wb.create_worksheet("数据")
for row in range(1, 10000001):
sheet.set_cell_value(f"A{row}", row)
wb.save("huge.xlsx")