如何解决与字符串列表相比,带有字典列表的 beam.Create() 非常慢
我正在使用 Dataflow 处理一个包含大约 400 万个特征(总共大约 2GB)的 Shapefile 并将几何加载到 BigQuery,所以在我的管道开始之前,我将 shapefile 特征提取到一个列表中,并使用 {{ 1}}。有两种方法可以创建初始功能列表:
- 将每个特征导出为 json 字符串,随后的
beam.Create(features)
需要将其解析为 dict:
DoFn
- 导出从 JSON 字符串预先解析的 python 字典
features = [f.ExportToJson() for f in layer]
使用选项 1 时,features = [json.loads(f.ExportToJson()) for f in layer]
需要一分钟左右,管道继续。使用选项 2,beam.Create(features)
在 6 核 i7 上需要 3 个多小时,而且似乎在这里花费了很多时间:
beam.Create(features)
这 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",in instance_to_type
typehints.Union[[instance_to_type(v) for k,in <listcomp>
是什么在传递字典列表时减慢了 trivial_inference
的速度?我是否可以将 beam.Create
配置为不执行它在其中尝试执行的任何操作,或者以其他方式加快速度,以便 dict 列表与字符串列表相比不会慢 100 倍?
解决方法
非常有趣的结果!
我的猜测是,发生这种情况是因为 Create
需要腌制它收到的所有数据。字典的pickle大小可能很大,因为它们被pickle为Python对象,而字符串被pickle为Python字符串。
你可以这样做:
p
| beam.Create([f.ExportToJson() for f in layer])
| beam.Map(json.loads)
为了避免额外的酸洗。这有帮助吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。