如何修复ASP.NET C#循环处理图片MODI OCR时的内存不足错误?
解决MODI批量OCR循环内存溢出问题
核心原因
MODI的Document是COM组件对象,循环中若未主动释放非托管资源,会快速导致内存泄漏,触发一轮循环后的内存不足错误。
具体修复步骤
- 强制释放COM资源:每次循环结束必须显式调用
Marshal.ReleaseComObject释放MODI相关对象,不能依赖.NET垃圾回收器自动清理。示例代码:using System.Runtime.InteropServices; using MODI; foreach (var imagePath in imagePaths) { Document modiDoc = null; try { modiDoc = new Document(); modiDoc.Create(imagePath); modiDoc.OCR(MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED, true, true); // 提取识别文本 string ocrContent = modiDoc.Images[0].Layout.Text; // 执行数据库写入操作... } finally { if (modiDoc != null) { modiDoc.Close(); Marshal.ReleaseComObject(modiDoc); // 关键:释放非托管资源 } } } - 避免复用全局MODI对象:不要在循环外创建
Document实例,每次循环都新建实例并在结束后释放。 - 及时清理临时文件:若图片是临时下载的,OCR完成后立即删除,减少磁盘与内存占用。
- 辅助内存回收:在循环末尾调用
GC.Collect()和GC.WaitForPendingFinalizers(),加快垃圾回收速度(仅作为辅助手段,核心仍需释放COM对象)。
替代方案(若MODI仍不稳定)
- 使用Tesseract OCR:开源无COM依赖,.NET有成熟NuGet包(
Tesseract),内存管理更可控。 - 使用Windows.Media.Ocr:适配.NET Core/.NET 5+及UWP项目,原生支持OCR,资源占用更合理。
内容的提问来源于stack exchange,提问作者user19895322
相关产品推荐
相关产品推荐

