我的硬盘上有大约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 {/} {/.}
答案 0 :(得分:6)
您需要 GNU Parallel 。在这里,我在iMac上以37s处理500个TIF文件,每个3kB。通过比较,如果在顺序for
循环中完成,则相同的处理需要160秒。
基本命令如下所示:
parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
将显示进度条并使用您计算机上的所有可用内核。这是在行动:
如果您想要在不实际执行任何操作的情况下查看其功能,请使用parallel --dry-run
。
由于您有135,000个文件,它可能会超出您的命令行长度 - 您可以像sysctl
这样查看:
sysctl -a kern.argmax
kern.argmax: 262144
所以你需要将文件名加到stdin
上的 GNU Parallel 中并用空字符分隔它们,这样就不会出现空格问题:
find . -iname \*.tif -print0 | parallel -0 --bar 'tesseract {} {.} > /dev/null 2>&1'
如果您正在处理大量文件,则可能需要考虑被中断和重新启动的可能性。在处理到名为mv
的子目录之后,您可以TIF
每个processed
文件,以便在重新启动时不会再次完成,或者您可以测试是否存在相应的txt
1}}文件在处理任何TIF
之前这样:
#!/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台计算机,包括localhost之类的计算机这样:
parallel -S :,remote1,remote2,remote3 ...
其中:
是您正在运行的计算机的简写。