流式处理模式是对原有批量处理模式的优化,主要解决大文档处理时的内存占用问题。
批量模式内存占用:
- 100页文档 × 每页约50MB = 5GB内存
流式模式内存占用:
- 当前页约50MB + 元数据约10MB = 60MB内存
# 使用流式处理模式
python main_v2.py -i large_doc.pdf -c config.yaml --streaming
# 批量处理模式(默认)
python main_v2.py -i small_doc.pdf -c config.yaml
from core.pipeline_manager_v2_streaming import StreamingDocPipeline
# 初始化流式处理流水线
pipeline = StreamingDocPipeline(config_path, output_dir)
# 处理文档
results = pipeline.process_document_streaming(
document_path="large_doc.pdf",
page_range="1-100",
output_config={
'save_json': True,
'save_markdown': True,
'save_page_json': True,
'normalize_numbers': True,
'merge_cross_page_tables': True,
}
)
1. 加载所有页面到内存
2. 处理第1页 → 存储到 results['pages'][0]
3. 处理第2页 → 存储到 results['pages'][1]
4. ...
5. 处理第N页 → 存储到 results['pages'][N-1]
6. 统一保存所有结果
7. 生成完整Markdown
1. 初始化Markdown文件(流式写入)
2. 处理第1页
→ 立即保存 page_001.json
→ 立即保存图片元素
→ 写入Markdown(单页内容)
→ 释放内存
3. 处理第2页
→ 立即保存 page_002.json
→ ...
4. ...
5. 处理第N页
→ 立即保存 page_NNN.json
→ ...
6. 关闭Markdown文件
7. 从已保存的JSON文件加载
8. 跨页表格合并
9. 重新生成完整Markdown(包含合并后的表格)
10. 生成middle.json
output/
├── doc_name_middle.json # 完整middle.json
├── doc_name.md # 完整Markdown
├── doc_name_page_001.json # 第1页JSON
├── doc_name_page_002.json # 第2页JSON
└── images/ # 图片元素
output/
├── doc_name_middle.json # 完整middle.json(最后生成)
├── doc_name.md # 完整Markdown(包含合并表格)
├── doc_name_page_001.json # 第1页JSON(立即保存)
├── doc_name_page_002.json # 第2页JSON(立即保存)
├── images/ # 图片元素(立即保存)
└── _temp_pages/ # 临时JSON文件(最后清理)
├── page_001.json
└── page_002.json
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
save_json |
bool | True | 是否生成middle.json |
save_markdown |
bool | True | 是否生成Markdown |
save_page_json |
bool | True | 是否保存每页JSON |
save_images |
bool | True | 是否保存图片元素 |
save_layout_image |
bool | False | 是否保存layout可视化图片 |
save_ocr_image |
bool | False | 是否保存OCR可视化图片 |
normalize_numbers |
bool | True | 是否标准化金额数字 |
merge_cross_page_tables |
bool | True | 是否合并跨页表格 |
cleanup_temp_files |
bool | True | 是否清理临时文件 |
| 文档页数 | 批量模式 | 流式模式 | 节省 |
|---|---|---|---|
| 10页 | ~500MB | ~60MB | 88% |
| 50页 | ~2.5GB | ~60MB | 97.6% |
| 100页 | ~5GB | ~60MB | 98.8% |
| 500页 | ~25GB | ~60MB | 99.76% |
差异:通常 < 5%,对于大文档可以忽略
_temp_pages/ 目录创建临时JSON文件cleanup_temp_files=True)page_range 参数继续处理剩余页面# 使用流式模式,节省内存
python main_v2.py \
-i large_report.pdf \
-c config/bank_statement_mineru_v2.yaml \
--streaming \
--output_dir ./output/large_report_streaming
# 流式模式 + 页面范围
python main_v2.py \
-i large_report.pdf \
-c config.yaml \
--streaming \
-p 1-50 # 只处理前50页
# 如果之前处理到第50页中断,可以继续处理
python main_v2.py \
-i large_report.pdf \
-c config.yaml \
--streaming \
-p 51- # 从第51页到最后
添加 --streaming 参数:
# 之前
python main_v2.py -i doc.pdf -c config.yaml
# 之后
python main_v2.py -i doc.pdf -c config.yaml --streaming
代码修改:
# 之前
from core.pipeline_manager_v2 import EnhancedDocPipeline
pipeline = EnhancedDocPipeline(config_path)
results = pipeline.process_document(document_path)
# 之后
from core.pipeline_manager_v2_streaming import StreamingDocPipeline
pipeline = StreamingDocPipeline(config_path, output_dir)
results = pipeline.process_document_streaming(
document_path,
output_config=output_config
)
输出格式保持一致: