Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing Tesseract OCR大量文件_Parallel Processing_Tesseract - Fatal编程技术网

Parallel processing Tesseract OCR大量文件

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

我的硬盘上大约有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/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
。你对此有什么看法?