在初始Popen解析之前用Popen()启动过多进程有多危险?在
我正在处理一个充满PDF的目录。我迭代每个文件并使用外部调用做两件事。在
首先,我从基于Xpdf的pdftohtml工具获得了一个html表示(pdfminer太慢了)。这样只输出第一页:
html = check_output(['pdftohtml.exe','-f','1','-l','1','-stdout','-noframes',pdf])
然后,如果我的条件得到满足(我确定它是正确的文档),我调用tabula extractor来提取一个表。与检查文档相比,这是一个缓慢/长时间运行的过程,可能只在1/20个文件上发生。在
如果我只做call(['jruby', 'C:\\jruby-1.7.4\\bin\\tabula', .....])
,我会花很长时间等待提取完成,同时我可以检查更多的文件(我有4个内核和16gb的ram,表格似乎不是多线程的)。在
因此,我使用Popen()来避免阻塞。在
^{pr2}$我不关心返回值(tabula正在创建一个csv文件,因此我可以随时查看它是否创建成功)。这样做意味着我可以继续在后台检查文件,并根据需要启动更多的表格进程(同样,只有大约1/20)。在
这是可行的,但它会被积压,最终一次运行大量的表格进程。所以我的问题是: 这不好吗?它会让电脑在其他方面变慢,但只要它不崩溃,并且能以最快的速度工作,我并不介意(所有4个内核始终保持在100%,但内存使用量不会超过5.5GB,因此它似乎受CPU限制)。在
如果它是坏的,什么是正确的方法来改善它?有没有一种方便的方法可以说,将tabla进程排队,这样每个内核总是有1-2个运行,但我不想一次处理30个文件?在
是的,^{} 模块就是这样做的。在
相关问题 更多 >
编程相关推荐