【问题标题】:Memory Blow Up when using Dask compute or persist with Dask Delayed使用 Dask 计算或使用 Dask Delayed 时内存爆炸
【发布时间】:2017-07-15 00:40:39
【问题描述】:

我正在尝试在一个数据框中处理多个主题的数据。有超过 30 个主题和每个主题 14 次计算这是一个大型数据集,但是超过 5 个会炸毁调度程序节点上的内存,而没有在与调度程序相同的节点上运行任何工作程序,因为它有 128gb 的内存?有什么想法可以解决这个问题,或者我做错了什么?代码如下。

def channel_select(chn,sub):

    subject = pd.DataFrame(df.loc[df['sub'] == sub])
    subject['s0'] = subject[chn]
    val = []
    for x in range(13):
        for i in range(len(subject)):
            val.append(subject['s0'].values[i-x])
        name = 's' + str(x+1)
        subject[name] = val
        val = []
    return subject

subs = df['sub'].unique()
subs = np.delete(subs, [34,33])

for s in subs:
    for c in chn:
        chn_del.append(delayed(channel_select)(c,subs[s]))

results = e.persist(pred)

我显示的代码可以运行所有主题,但一次超过 5 个,并且内存不足

【问题讨论】:

  • 这里df的尺寸是多少,pred是从哪里来的?我注意到df 必须是函数闭包中包含的全局变量,并且您的代码非常循环,因此它可能可以用更好的 pandas 方法重写。
  • 您可以尝试e.scatter(df) 并在函数签名中传递df 以避免将其直接复制到图中X 次。

标签: dask


【解决方案1】:

您是在告诉计算机保留将近 1,000 GB 的内存。

但你已经知道了(:

【讨论】:

    【解决方案2】:

    正如 Mary 上面所说,每次调用 channel_select 都会创建数据帧并将其存储在调度程序内存中,有 30 个主题每次调用 14 次和一个 2gb 数据帧......是的,你可以计算出试图抓取多少内存.

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 2019-04-02
      • 2017-06-18
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多