Python 在EC2上运行大数据计算时出现dask.async.MemoryError

Python 在EC2上运行大数据计算时出现dask.async.MemoryError,python,pandas,memory,dask,Python,Pandas,Memory,Dask,我有一个m4.4XL(64 GB ram)EC2盒。我正在和熊猫一起经营达斯克。我得到以下内存错误 我是在大约24小时的运行后得到这个结果的,这差不多是完成任务所需的时间,所以我不确定错误是否是由于RAM、磁盘内存不足造成的。在脚本结束时,我执行DF.to_csv()将较大的DF写入磁盘,还是pandas/numpy内部内存限制 raise(remote_exception(res, tb)) dask.async.MemoryError: Traceback ---------

我有一个m4.4XL(64 GB ram)EC2盒。我正在和熊猫一起经营达斯克。我得到以下内存错误

我是在大约24小时的运行后得到这个结果的,这差不多是完成任务所需的时间,所以我不确定错误是否是由于RAM、磁盘内存不足造成的。在脚本结束时,我执行DF.to_csv()将较大的DF写入磁盘,还是pandas/numpy内部内存限制

raise(remote_exception(res, tb))
    dask.async.MemoryError: 

Traceback
---------
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/dask/async.py", line 267, in execute_task
    result = _execute_task(task, data)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/dask/async.py", line 248, in _execute_task
    args2 = [_execute_task(a, cache) for a in args]
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/dask/async.py", line 249, in _execute_task
    return func(*args2)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 4061, in apply
    return self._apply_standard(f, axis, reduce=reduce)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 4179, in _apply_standard
    result = result._convert(datetime=True, timedelta=True, copy=False)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 3004, in _convert
    copy=copy)).__finalize__(self)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 2941, in convert
    return self.apply('convert', **kwargs)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 2901, in apply
    bm._consolidate_inplace()
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3278, in _consolidate_inplace
    self.blocks = tuple(_consolidate(self.blocks))
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 4269, in _consolidate
    _can_consolidate=_can_consolidate)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 4289, in _merge_blocks
    new_values = _vstack([b.values for b in blocks], dtype)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 4335, in _vstack
    return np.vstack(to_stack)
  File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/numpy/core/shape_base.py", line 230, in vstack
    return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
更新:

因此,根据奥克林先生的回答,还有一些额外的信息

以下是我执行流程的方式:

def dask_stats_calc(dfpath,v1,v2,v3...):
    dfpath_ddf = dd.from_pandas(dfpath,npartitions=16,sort=False)
    return dfpath_ddf.apply(calculate_stats,axis=1,args=(dfdaily,v1,v2,v3...)).compute(get=get).stack().reset_index(drop=True)

f_threaded = partial(dask_stats_calc,dfpath,v1,v2,v3...,multiprocessing.get)
f_threaded()
现在问题是
dfpath
是一个有140万行的df,因此
dfpath\u ddf.apply()
运行了140万行

一旦整个
dfpath\u ddf.apply()
完成,就会出现
df.to\u csv()
,但正如您所说,最好定期写入磁盘

现在的问题是,我如何实现周期性磁盘写入,比如说每200k行一次?我想我可以把
dfpath\u ddf
分成20万个块(或类似的东西),然后依次运行每个块

单线程执行 有时,在等待写入磁盘上的单个文件时,任务在RAM中累积。使用这样的顺序输出对于并行系统来说本质上是很棘手的。如果您需要使用单个文件,那么我建议尝试使用相同的计算单线程,看看它是否有不同

with dask.set_options(get=dask.async.get_sync):
    DF.to_csv('out.csv')
写入多个文件 或者,您可以尝试写入许多CSV文件。这在调度上要容易得多,因为任务不必等到前一个任务完成后才能写入磁盘并从RAM中删除自己

DF.to_csv('out.*.csv')
例子 因此,并行执行和编写的一种常见且相当健壮的方法是将您的计算和最后对的调用结合起来

ddf = dd.from_pandas(df, npartitions=100)
ddf.apply(myfunc).to_csv('out.*.csv')

这将把数据帧分解成块,对每个块调用函数,将该块写入磁盘,然后删除中间值,释放空间。

谢谢您的回答。根据您的建议,我添加了一些额外的信息,以便定期写入磁盘。我很感激你的帮助。也许最近添加的文本会有所帮助?这太完美了。非常感谢你,奥克林先生!我很感激。