我有一个用Python 2.7编写的软件,它大量使用Celery。我现在使用StanfordNER添加了NER支持,我想知道如何在标记多个文档时提高性能;每个标记任务都在新工作者上运行。
我像这样实施了斯坦福大学:
from nltk.tag import StanfordNERTagger
class NETagger(object):
def __init__(self, path):
model = '/opt/Projects/nlp/stanford-ner-2015-04-20/classifiers/german/german.hgc_175m_600.crf.ser.gz'
jar = '/opt/Projects/nlp/stanford-ner-2015-04-20/stanford-ner.jar'
self.tagger = StanfordNERTagger(model, jar, encoding='utf-8', java_options='-mx8000m')
def assign_tags(self, file):
with open(file, 'r') as f:
tokens = f.readlines()
ne_result = self.tagger.tag(tokens)
[... write ne_result to file ...]
这就是Celery所发生的事情。我有一个任务,为每个将通过NER的文件排队一个子任务:
nertask = ExperimentalDataminingNER()
tagger = NETagger('path/to/files')
for file in 'path/to/files':
[... create the task context ...]
nertask.apply_async((context,), queue='default', task_id=id)
子任务只做这个(我剥离的行对NER没有影响):
class ExperimentalDataminingNER():
[...]
tagger.assign_tags(input_file_file)
基本上,我拥有的每个文档都标记在一个工作者身上。我把他们排队,工人们做他们的工作并且做得很好。
我的问题:如果我不使用Celery,并且只使用开箱即用的StanfordNER,在我的机器上处理一个文件需要4-7秒。当同时运行其中四个NER任务时(我有四个工作人员),每个任务需要12到18秒。虽然我总体上使用Celery仍然更快,但我想知道我是否可能在某处引入某种人为瓶颈?或者它是如此资源密集,以至于没有办法解决它?
顺便说一句,我正在使用ntlk
。
修改
我尝试在Celery之外运行四个并行的StanfordNER实例,结果是一样的,我注意到每个文件所需的时间急剧增加。
我也注意到我的测量结果是标准实现,实际上是4-7秒(现在编辑),这对Celery实现来说有点不好。