我制作了一个Python模块,用于从PDF中提取手写文本。提取有时可能非常慢(每个文件20-30秒)。我有大约100,000个PDF(一些有很多页面),我想在所有这些上运行文本提取。基本上是这样的:
fileNameList = ['file1.pdf','file2.pdf',...,'file100000.pdf']
for pdf in fileList:
text = myModule.extractText(pdf) # Distribute this function
# Do stuff with text
我们曾经使用过Spark(一个同事,而不是我)来将几百万个文件从SQL DB分发到几个服务器上的Solr,但是在研究这个时,Spark似乎更多地用于并行化大型数据集,而不是如此多地分配一项任务。为此,看起来Python的内置“进程池”模块会更好,我可以在具有4个CPU内核的单个服务器上运行它。
我知道更多的是针对具体问题,但在走错路之前,我只想提出一些建议。对于我的用例,我应该坚持使用Process Pools的单个服务器,还是使用Spark将其拆分到多个服务器上?
答案 0 :(得分:0)
使用Spark是完全合理的,因为您可以通过将文件放在分布式存储上来跨多个执行程序分发文本提取任务。这样您就可以扩展计算以处理文件,并使用pySpark非常有效地将结果写回。您甚至可以使用现有的Python文本提取代码:
input = sc.binaryFiles("/path/to/files")
processed = input.map(lambda (filename, content): (filename, myModule.extract(content)))
随着您的数据量增加或您希望增加吞吐量,您只需添加其他节点。