You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:05:20