0

我正在使用 Dataflow 处理具有大约 400 万个特征(总共约 2GB)的 Shapefile 并将几何加载到 BigQuery 中,因此在我的管道开始之前,我将 shapefile 特征提取到一个列表中,并使用beam.Create(features). 有两种方法可以创建初始功能列表:

  1. 将每个特征导出为 json 字符串,后续DoFns 需要将其解析为 dict:
features = [f.ExportToJson() for f in layer]
  1. 导出从 JSON 字符串预解析的 python dict
features = [json.loads(f.ExportToJson()) for f in layer]

使用选项 1 时,beam.Create(features)需要一分钟左右,管道继续。使用选项 2,beam.Create(features)在 6 核 i7 上需要 3 多个小时,并且似乎在这里花费了很多时间:

  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/apache_beam/typehints/trivial_inference.py", line 88, in <listcomp>
    typehints.Union[[instance_to_type(v) for k, v in o.items()]],
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/apache_beam/typehints/trivial_inference.py", line 88, in instance_to_type
    typehints.Union[[instance_to_type(v) for k, v in o.items()]],
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/apache_beam/typehints/trivial_inference.py", line 88, in <listcomp>

这是传递字典列表时trivial_inference变慢的原因吗?beam.Create我可以配置beam.Create为不做它试图在那里做的任何事情,或者以其他方式加快它的速度,这样字典列表就不会比字符串列表慢 100 倍?

4

1 回答 1

0

非常有趣的结果!

我的猜测是,发生这种情况是因为Create需要腌制它收到的所有数据。字典的腌制大小可能很大,因为它们被腌制为 Python 对象,而字符串被腌制为 Python 字符串。

你可以这样做:

p
| beam.Create([f.ExportToJson() for f in layer])
| beam.Map(json.loads)

避免额外的酸洗。这有帮助吗?

于 2021-03-24T00:41:28.057 回答