Python 内存和Dask分布的问题:加载到内存中的数据大小是加载到内存中的数据大小的数倍,并且数据溢出不会发生

Python 内存和Dask分布的问题:加载到内存中的数据大小是加载到内存中的数据大小的数倍,并且数据溢出不会发生,python,dask,dask-distributed,datashader,Python,Dask,Dask Distributed,Datashader,我正在用Dask分布式和Datashader运行一些简单的测试,但我遇到了两个我无法解决的问题,也不明白为什么会发生 我处理的数据由17亿行和97列组成,分布在64个拼花地板文件中。我的测试代码如下所示,其中我只是在散点图中绘制了两列数据,如下所示的示例代码: 这两个问题是: 首先,我的工作人员将太多的数据存入内存。例如,我只使用一个worker和一个文件运行了前面的代码。即使一个文件是11gb,Dask仪表板显示加载到内存中的大约50gb。我找到的唯一解决方案是更改以下行,明确列的一小部分:

我正在用Dask分布式和Datashader运行一些简单的测试,但我遇到了两个我无法解决的问题,也不明白为什么会发生

我处理的数据由17亿行和97列组成,分布在64个拼花地板文件中。我的测试代码如下所示,其中我只是在散点图中绘制了两列数据,如下所示的示例代码:

这两个问题是:

首先,我的工作人员将太多的数据存入内存。例如,我只使用一个worker和一个文件运行了前面的代码。即使一个文件是11gb,Dask仪表板显示加载到内存中的大约50gb。我找到的唯一解决方案是更改以下行,明确列的一小部分:

def plot(file_path):
    dask_df = dd.read_parquet(file_path,  columns=['x','y',...], engine='pyarrow') 
    …
尽管这是可行的(因为我只使用了两列来绘制图,这很有意义),但对于工作人员为什么要使用这么多内存,仍然令人困惑

第二个问题是,即使我在~/.config/dask/distributed.yaml文件中配置了70%的溢出率,我的工作人员仍然会崩溃,因为他们的内存不足:

distributed.nanny-警告-工作进程超出95%的内存预算。 重新启动distributed.nanny-警告-重新启动工作进程

最后,当我绘制所有点时,只带了5列
列=['x'、'y'、'a'、'b'、'c']
读取数据时,我会得到不合理的慢时间。尽管文件被分割成8个磁盘以加快I/O速度并使用8个内核(8个工作线程),但绘制17亿个点需要5分钟

我使用的是:dask 2.18.0、分布式2.19.0、datashader 0.10.0和python 3.7.7

我已经为此苦苦挣扎了整整一周,所以任何建议都将不胜感激。请随时向我询问可能丢失的任何其他信息

尽管这是可行的(因为我只使用了两列来绘制图,这很有意义),但对于工作人员为什么要使用这么多内存,仍然令人困惑

拼花地板是一种相对有效的形式。例如,您的数据可能在磁盘上被压缩,但在Pandas中未被压缩,或者Pandas字符串类型可能导致一些膨胀(Pandas使用Python字符串,它们很大)

第二个问题是,即使我在~/.config/dask/distributed.yaml文件中配置了70%的溢出率,我的工作人员仍然会崩溃,因为他们的内存不足:

我不知道用这个告诉你什么。Dask无法阻止Python函数耗尽RAM。我会和datashader人员联系,但我希望他们的代码非常紧凑

最后,当我绘制所有点时,在读取数据时,只带了5列,列=['x','y','a','b','c'],我得到了不合理的慢时间。尽管文件被分割成8个磁盘以加快I/O速度并使用8个内核(8个工作线程),但绘制17亿个点需要5分钟


很难通过堆栈溢出诊断性能问题。我建议遵循此处的指导:

列出您的dask、分布式和datashader版本会有所帮助。
def plot(file_path):
    dask_df = dd.read_parquet(file_path,  columns=['x','y',...], engine='pyarrow') 
    …