Memory leaks 执行令人尴尬的并行数据连接时,dask中出现KilledWorker错误

Memory leaks 执行令人尴尬的并行数据连接时,dask中出现KilledWorker错误,memory-leaks,dask,distributed-computing,dask-distributed,dask-delayed,Memory Leaks,Dask,Distributed Computing,Dask Distributed,Dask Delayed,我有一个程序,我在其中读取一组拼花文件,将它们连接到更大的拼花文件中,然后将其写回磁盘。我在一台分布式计算机(带有分布式文件系统)上运行它,大约有300名工作人员,每个工作人员有20GB的RAM。每个单独的工作应该只消耗2-3 GB的RAM,但由于内存错误(获取:distributed.scheduler.KilledWorker异常),工作进程正在崩溃。我可以在工人的输出日志上看到以下内容: 内存使用率很高,但工作进程没有要存储到磁盘的数据。也许 另一个进程正在泄漏内存。进程内存:18.20

我有一个程序,我在其中读取一组拼花文件,将它们连接到更大的拼花文件中,然后将其写回磁盘。我在一台分布式计算机(带有分布式文件系统)上运行它,大约有300名工作人员,每个工作人员有20GB的RAM。每个单独的工作应该只消耗2-3 GB的RAM,但由于内存错误(获取:distributed.scheduler.KilledWorker异常),工作进程正在崩溃。我可以在工人的输出日志上看到以下内容:

内存使用率很高,但工作进程没有要存储到磁盘的数据。也许 另一个进程正在泄漏内存。进程内存:18.20 GB

我是不是漏掉了什么明显的东西? 谢谢


Dask版本:2021.01.0,pyarrow版本:2.0.0,分布式版本:2021.01.0

存在一些语法错误,但总体上工作流似乎合理

打开('ts\u files\u list.txt','r')作为f:
所有_文件=f.readlines()
所有_文件=[f.strip()表示所有_文件中的f]
npart=10000
file\u pieces=np.array\u split(所有文件,npart)
def read_和_组合(文件名、组名):
分组的_df=pd.concat(文件名中f的pd.read_拼花地板(f))
组合拼花地板(组名称,engine='pyarrow')
del grouped_df#这是可选的(原则上dask应该清理这些对象)
组名称=[f'组{i}'表示范围内的i(npart)]
延迟的函数=延迟的数据(读取和合并)
compute(映射(延迟函数、文件、组名))

需要记住的另一件事是,
parquet
文件在默认情况下是压缩的,因此在解压缩时,它们可能会占用比压缩文件大小多得多的内存。不确定这是否适用于您的工作流程,但在遇到内存问题时要记住一点。

文件是否在本地文件系统中?请说明您的dask、distributed和pyarrow版本。@mdurant这些文件位于超级计算机的分布式文件系统上。Dask版本:2021.01.0,pyarrow版本:2.0.0,分布式版本:2021.01.0在做任何其他事情之前,我会尝试降级pyarrow或尝试使用fastparquet。
with open('ts_files_list.txt', 'r') as f:
    all_files = f.readlines()

# There are about 500K files
all_files = [f.strip() for f in all_files]

# grouping them into groups of 50. 
# The concatenated df should be about 1GB in memory
npart = 10000
file_pieces = np.array_split(all_files, npart)

def read_and_combine(filenames, group_name):
    dfs = [pd.read_parquet(f) for f in filenames]
    grouped_df = pd.concat(dfs)
    grouped_df.to_parquet(f, engine='pyarrow')

group_names = [f'group{i} for i in range(npart)]
delayed_func = dask.delayed(read_and_combine)

# the following line shouldn't have resulted in a memory error, but it does
dask.compute(map(delayed_func, file_pieces, group_names))