gpt4 book ai didi

pandas - 无法解释的 Dask 内存使用情况

转载 作者:行者123 更新时间:2023-12-05 06:01:13 26 4
gpt4 key购买 nike

我正在深入研究 Dask 并且(大部分)对它感到满意。但是我无法理解以下场景中发生的事情。 TBH,我敢肯定过去曾有人问过这样的问题,但搜索了一段时间后,我似乎找不到真正切中要害的问题。所以我们来了!

在下面的代码中,您可以看到一个带有 Dask 延迟装饰器的简单 python 函数。在我的真实用例场景中,这将是一个“黑匣子”类型的函数,我不关心其中会发生什么,只要它保持 4 GB 内存预算并最终返回 pandas 数据帧即可。在这种情况下,我特别选择了值 N=1.5e8,因为这导致总内存占用量接近 2.2 GB(很大,但仍在预算之内)。最后,当将这个文件作为脚本执行时,我有一个“数据管道”,它只是为一些 ID 运行黑盒函数,最后建立一个结果数据帧(我可以用它做更多的事情)

执行此操作时会出现令人困惑的位。我可以看到一次只执行了两个函数调用(这是我所期望的),但我收到警告消息 distributed.worker - WARNING - Memory use is high but worker has no data to store to disk。也许其他一些进程正在泄漏内存? Process memory: 3.16 GiB -- Worker memory limit: 3.73 GiB,此后不久脚本过早退出。这个内存使用量来自哪里?请注意,如果我增加 memory_limit="8GB"(这实际上超过了我的计算机),那么脚本运行正常并且我的打印语句告诉我数据帧确实只使用了 2.2 GB 的内存

请帮助我理解这种行为,并希望实现一种内存更安全的方法

非常感谢!

顺便说一句:

  • 如果有帮助,我使用的是 python 3.8.8、dask 2021.4.0 和分布式 2021.4.0
  • 我还在 Linux (Ubuntu) 机器和 Mac M1 上证实了这种行为。它们都表现出相同的行为,尽管 Mac M1 因同样的原因失败且内存使用量少得多(N=3e7,或大约 500 MB)

import time

import pandas as pd
import numpy as np
from dask.distributed import LocalCluster, Client
import dask


@dask.delayed
def do_pandas_thing(id):
print(f"STARTING: {id}")
N = 1.5e8
df = pd.DataFrame({"a": np.arange(N), "b": np.arange(N)})

print(
f"df memory usage {df.memory_usage().sum()/(2**30):.3f} GB",
)

# Simulate a "long" computation
time.sleep(5)

return df.iloc[[-1]] # return the last row


if __name__ == "__main__":
cluster = LocalCluster(
n_workers=2,
memory_limit="4GB",
threads_per_worker=1,
processes=True,
)
client = Client(cluster)

# Evaluate "black box" functions with pandas inside
results = []
for i in range(10):
results.append(do_pandas_thing(i))

# compute
r = dask.compute(results)[0]

print(pd.concat(r, ignore_index=True))

最佳答案

我无法使用以下版本重现警告/错误:

  • Pandas =1.2.4
  • dask=2021.4.1
  • python =3.8.8

当对象大小时,进程确实会因内存而崩溃,但最好让工作负载只占可用内存的一小部分:

To put it simply, we weren't thinking about analyzing 100 GB or 1 TB datasets in 2011. Nowadays, my rule of thumb for pandas is that you should have 5 to 10 times as much RAM as the size of your dataset. So if you have a 10 GB dataset, you should really have about 64, preferably 128 GB of RAM if you want to avoid memory management problems. This comes as a shock to users who expect to be able to analyze datasets that are within a factor of 2 or 3 the size of their computer's RAM.

source

关于pandas - 无法解释的 Dask 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67272038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com