小编Luc*_*anc的帖子

为什么调用 Tesseract 进程会导致这个服务随机崩溃?

我有一个 .NET Core 2.1 服务,它在 Ubuntu 18.04 VM 上运行并通过 Process 实例调用 Tesseract OCR 4.00。我想使用 API 包装器,但我只能找到一个可用的,而且它只在最新版本的 Tesseract 中处于测试阶段——稳定的包装器使用版本 3 而不是 4。过去,这项服务运行良好,但我一直在更改它,以便减少从磁盘写入和读取文档/图像数据的频率,以提高速度。该服务曾经调用更多由于 API 的存在而不必要的外部进程(例如 ImageMagick),因此我一直用 API 调用替换它们。

最近,我一直在使用从真实数据中提取的示例文件对此进行测试。这是一个传真文档 PDF,有 133 页,但由于灰度和分辨率的原因,只有 5.8 MB。该服务获取一个文档,将其拆分为单独的页面,然后分配多个线程(每页一个线程)来调用 Tesseract 并使用Parallel.For. 线程限制是可配置的。我知道 Tesseract 有自己的多线程环境变量 (OMP_THREAD_LIMIT)。我在之前的测试中发现,将其设置为“1”是目前我们设置的理想选择,但在我最近针对此问题的测试中,我尝试将其设置为未设置(动态值),但没有任何改进。

问题是,不可预测的是,当调用 Tesseract 时,该服务将挂起大约一分钟然后崩溃,而 journalctl 中显示的唯一错误是:

dotnet[32328]: Error while reaping child. errno = 10
dotnet[32328]:    at System.Environment.FailFast(System.String, System.Exception)
dotnet[32328]:    at System.Environment.FailFast(System.String)
dotnet[32328]:    at System.Diagnostics.ProcessWaitState.TryReapChild()
dotnet[32328]:    at System.Diagnostics.ProcessWaitState.CheckChildren(Boolean)
dotnet[32328]:    at System.Diagnostics.Process.OnSigChild(Boolean)
Run Code Online (Sandbox Code Playgroud)

对于这个特定的错误,我在网上根本找不到任何东西。根据我在Process课堂上所做的相关研究,在我看来,当进程退出并且 dotnet 试图清理它正在使用的资源时,就会发生这种情况。我真的不知道如何解决这个问题,尽管我已经尝试了许多“猜测”,例如更改线程限制值。线程之间没有交叉。每个线程都有自己的页面分区(基于如何Parallel.For对集合进行分区),并且一次一个处理这些页面。

这是进程调用,从多个线程中调用(8 是我们通常设置的限制):

private …
Run Code Online (Sandbox Code Playgroud)

c# linux multithreading tesseract .net-core

5
推荐指数
1
解决办法
381
查看次数

标签 统计

.net-core ×1

c# ×1

linux ×1

multithreading ×1

tesseract ×1