在 Python Polars 中将函数应用于列内存不足

apply function to column out-of-memory in Python Polars

提问人:Lionel Peer 提问时间:1/11/2023 更新时间:1/11/2023 访问量:411

问:

我有一个大型 GIS 数据集 (167x25e6),它是通过 .csv 到现在的 parquet 从 GeoJSON 生成的。这是我第一次真正需要处理内存不足的数据帧,我仍在努力找出 Polars 是否是我任务的正确选择,所以如果您知道使用不同库的解决方案,我同样很高兴知道这一点。

懒惰地加载文件没有问题,但我需要转换某些值,这就是我卡住的地方。由于数据来自GeoJSON,例如,我有一个列,其中包含坐标对的字符串列表:。'geometry.coordinates''[[122.9491889477, 24.4571703672], [122.946780324, 24.4541877508]]'

在上面列的示例中,我需要应用一个函数,该函数返回平均经度和平均纬度,并将其写入新列。

我尝试将列转换为数据类型,并尝试与执行 JSON 字符串加载的 lambda 一起使用:pl.Listapply

df_pl.select(pl.col('geometry.coordinates')).with_column(pl.col('geometry.coordinates').cast(pl.List)).collect()

df_pl.select(pl.col('geometry.coordinates')).with_column(pl.col('geometry.coordinates').apply(lambda x: json.loads(x)).collect()

不幸的是,第一个抛出一个 NotYetImplementedError: Casting from LargeUtf8 to LargeList not supported。第二个使 Python 内核立即崩溃,因为它没有内存。

我尝试的另一件事是,我可以将结果流式传输到磁盘,然后与实际需要的数据合并,但这会引发 PanicException:sink_parquet标准引擎尚不支持。使用 'collect().write_parquet()'sink_parquetcollect

感谢您的帮助!

内存不足 dask vaex rust-polars

评论

0赞 Dean MacGregor 1/11/2023
您使用什么将数据集从 .csv 转换为 .geojson,然后再转换为 .parquet?它不应该将几何图形保存为字符串,这就是您遇到问题的原因。话虽如此,极地不支持几何 (GIS) 操作,因此您必须查看地理熊猫。有一个地极地项目,但它处于原型阶段,因此可能缺少您目前需要的功能。
0赞 mdurant 1/12/2023
请提供您的数据示例,以便我们向您展示可能的工作流程,即使我们没有达到内存限制。
0赞 Niladri 2/1/2023
but this throws a PanicException: sink_parquet not yet supported in standard engine. Use 'collect().write_parquet()'- 确切地说,当您使用任何过滤器/谓词或联接时,就会发生这种情况

答: 暂无答案