跳转至

内存管理

本页面介绍如何管理内存以处理大型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")

下一步