繁体   English   中英

我应该如何在分布式 dask 中为每个工作人员加载内存密集型帮助对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM