Parallel processing Tesseract OCR大量文件
我的硬盘上大约有135000个Parallel processing Tesseract OCR大量文件,parallel-processing,tesseract,Parallel Processing,Tesseract,我的硬盘上大约有135000个.TIF文件(1.2KB到1.4KB)。我需要从这些文件中提取文本。如果我以cron作业的形式运行tesseract,我最多每小时可以得到500到600。有人能给我建议一些策略,让我每分钟至少能拿到500英镑吗 更新: 下面是我根据@Mark给出的建议执行后的代码,但我似乎每分钟不会超过20个文件 #!/bin/bash cd /mnt/ramdisk/input function tess() { if [ -f /mnt/ramdisk/outpu
.TIF
文件(1.2KB到1.4KB)。我需要从这些文件中提取文本。如果我以cron作业的形式运行tesseract
,我最多每小时可以得到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并行。在这里,我在iMac上以37秒的速度处理500个3kB的TIF文件。通过比较,如果在连续的
for
循环中完成相同的处理,则需要160秒
基本命令如下所示:
parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
sysctl -a kern.argmax
kern.argmax: 262144
#!/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
parallel -S :,remote1,remote2,remote3 ...
这将显示一个进度条,并使用机器上所有可用的内核。这就是它的作用:
如果您想知道它在不实际执行任何操作的情况下会做什么,请使用parallel--dry run
由于您有135000个文件,它可能会溢出您的命令行长度-您可以使用
sysctl
进行如下检查:
parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
sysctl -a kern.argmax
kern.argmax: 262144
#!/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
parallel -S :,remote1,remote2,remote3 ...
因此,您需要将文件名压缩到其stdin
上的GNU Parallel,并用空字符分隔它们,这样就不会出现空格问题:
find . -iname \*.tif -print0 | parallel -0 --bar 'tesseract {} {.} > /dev/null 2>&1'
<>如果你处理大量的文件,你可能需要考虑中断和重新启动的可能性。您可以将
mv
每个TIF
文件处理到名为processed
的子目录后,使其在重新启动时不会再次执行,或者您可以在处理任何TIF
之前,测试是否存在相应的txt
文件,如下所示:
parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
sysctl -a kern.argmax
kern.argmax: 262144
#!/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
parallel -S :,remote1,remote2,remote3 ...
如果连续运行两次,您将看到第二次几乎是瞬时的,因为所有处理都是第一次完成的
如果你有数百万文件,你可以考虑并行使用多台机器,所以确保你在网络上的每台机器上都有<代码> SSH < /C>登录,然后在4台机器上运行,包括这样的本地主机:
parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
sysctl -a kern.argmax
kern.argmax: 262144
#!/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
parallel -S :,remote1,remote2,remote3 ...
其中
:
是运行机器的简写。非常感谢您的详细解释。我之前试过并行,但可能是我做错了。我按照你的建议做了,现在我的速度是每分钟50-60次。我使用的是4CPU、16GB内存的Ubuntu 16.04云虚拟机。如有任何进一步提高绩效的建议,我们将不胜感激。在这个135000个样本之后,我需要处理大约2000万个这样的TIF
s。我在原始答案的底部添加了更多的想法。您也可以尝试-j12
或-j24
一次运行12或24个作业,看看这是否有帮助……为什么您能够在不到一分钟内完成500个作业,这仅仅是因为我们机器的肌力不同吗?我会考虑增加更多的VM实例。也许你的机器有慢磁盘?您可以尝试将一些TIF复制到RAMdrive并再次运行<代码>mkdir-p/media/RAMDRIVE;mount-t tmpfs-o size=2048M tmpfs/media/RAMDRIVECool ideas。我还查看了Spark
和Hbase
。你对此有什么看法?