gpt4 book ai didi

parallel-processing - Tesseract OCR 大量文件

转载 作者:行者123 更新时间:2023-12-05 09:17:25 24 4
gpt4 key购买 nike

我的硬盘上有大约 135000 个 .TIF 文件(1.2KB 到 1.4KB)。我需要从这些文件中提取文本。如果我将 tesseract 作为 cron 作业运行,我每小时最多可以获得 500 到 600 个。谁能给我建议策略,让我每分钟至少能赚 500 次?

更新:

下面是我根据@Mark 给出的建议实现后的代码,但我似乎仍然没有超过每分钟 20 个文件。

#!/bin/bash

cd /mnt/ramdisk/input

function tess()
{
if [ -f /mnt/ramdisk/output/$2.txt ]
then
echo skipping $2
return
fi
tesseract --tessdata-dir /mnt/ramdisk/tessdata -l eng+kan $1 /mnt/ramdisk/output/$2 > /dev/null 2>&1
}

export -f tess

find . -name \*.tif -print0 | parallel -0 -j100 --progress tess {/} {/.}

最佳答案

您需要 GNU Parallel。在这里,我在 iMac 上用 37 秒处理了 500 个 3kB 的 TIF 文件。相比之下,如果在顺序 for 循环中完成相同的处理需要 160 秒。

基本命令如下所示:

parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif

这将显示进度条并使用您机器上的所有可用内核。这是实际操作:

enter image description here

如果您想在不实际执行任何操作的情况下查看它会做什么,请使用 parallel --dry-run


因为你有 135,000 个文件,它可能会溢出你的命令行长度 - 你可以像这样使用 sysctl 检查:

sysctl -a kern.argmax
kern.argmax: 262144

因此您需要将文件名输入 GNU Parallelstdin 并用空字符分隔它们,这样您就不会遇到空格问题:

find . -iname \*.tif -print0 | parallel -0 --bar 'tesseract {} {.} > /dev/null 2>&1'

如果您正在处理大量文件,您可能需要考虑被中断和重新启动的可能性。您可以在处理到名为 processed 的子目录后将每个 TIF 文件 mv 以便在重新启动时不会再次完成,或者您可以在处理任何 TIF 之前测试相应的 txt 文件是否存在,如下所示:

#!/bin/bash

doit() {
if [ -f "${2}.txt" ]; then
echo Skipping $1...
return
fi
tesseract "$1" "$2" > /dev/null 2>&1
}

export -f doit
time parallel --bar doit {} {.} ::: *.tif

如果你连续运行两次,你会发现第二次几乎是瞬时的,因为所有的处理都是第一次完成的。


如果你有数百万个文件,你可以考虑并行使用多台机器,所以只要确保你有 ssh 登录到网络上的每台机器,然后在 4 台机器上运行,包括像这样的本地主机:

parallel -S :,remote1,remote2,remote3 ...

: 是您正在运行的机器的简写。

关于parallel-processing - Tesseract OCR 大量文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47958163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com