[英]How should I load a memory-intensive helper object per-worker in dask distributed?
我目前正在尝试使用dask + spaCy解析大量文本文档。 SpaCy 要求我加载一个相对较大的Language
对象,我希望每个工作人员加载一次。 我有几个映射函数我想应用于每个文档,我希望不必为每个未来/函数调用重新初始化这个对象。 处理这个问题的最佳方法是什么?
我在说什么的例子:
def text_fields_to_sentences(
dataframe:pd.DataFrame,
...
)->pd.DataFrame:
# THIS IS WHAT I WOULD LIKE TO CHANGE
nlp, = setup_spacy(scispacy_version)
def field_to_sentences(row):
result = []
doc = nlp(row[text_field])
for sentence_tokens in doc.sents:
sentence_text = "".join([t.string for t in sentence_tokens])
r = text_data.copy()
r[sentence_text_field] = sentence_text
result.append(r)
return result
series = dataframe.apply(
field_to_sentences,
axis=1
).explode()
return pd.DataFrame(
[s[new_col_order].values for s in series],
columns=new_col_order
)
input_data.map_partitions(text_fields_to_sentences)
您可以将对象创建为延迟对象
corpus = dask.delayed(make_corpus)("english")
然后使用这个惰性值代替完整值:
df = df.text.apply(parse, corpus=corpus)
Dask 将在一台机器上调用make_corpus
一次,然后根据需要将其传递给工作人员。 它不会重新计算任何任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.