json和请求的Dask内存泄漏问题

jsa*_*yce 6 json python-requests dask dask-distributed dask-kubernetes

这只是在远程 Dask kubernetes 集群中重现内存泄漏问题的示例最小测试。

def load_geojson(pid):
    import requests
    import io
    r = requests.get("https://github.com/datasets/geo-countries/raw/master/data/countries.geojson")
    temp = r.json()
    import sys
    size_temp = sys.getsizeof(temp)
    del temp
    return size_temp

L_geojson = client.map(load_geojson, range(200))

del L_geojson
Run Code Online (Sandbox Code Playgroud)

观察:每次运行时工作内存(字节存储)稳定增加约 30 MB,并持续增加直到使用整个内存。我用 urllib 尝试的另一个测试,我观察到每次运行时内存随机增加和减少。

预期行为:删除引用 L_geojson 后应清理内存。

有人可以帮忙解决这个内存泄漏问题吗?

mdu*_*ant 1

我可以确认内存增加和“完整垃圾收集最近占用了 X% CPU 时间”消息。如果我允许期货运行,内存也会增加,但速度会更慢。

正如您在使用中发现的那样,使用fsspec不存在此问题urllib,这就是 Dask 通常用于其 IO 的方式(fsspec从通信切换为requests使用aiohttp)。

您修改后的函数可能看起来像

def load_geojson(pid):
    import fsspec
    import json
    fs = fsspec.filesystem("http"). # or use fsspec.open
    r = fs.cat("https://github.com/datasets/geo-countries/raw/master/data/countries.geojson"). # get bytes
    temp = json.loads(r)
    import sys
    size_temp = sys.getsizeof(temp)
    del temp
    return size_temp
Run Code Online (Sandbox Code Playgroud)

但您仍然会收到垃圾收集警告。