Взрыв памяти при использовании вычислений Dask или сохранение с задержкой Dask

Я пытаюсь обработать данные нескольких субъектов в одном кадре данных. Существует> 30 субъектов и 14 вычислений на субъект, это большой набор данных, но больше 5 взрывает память на узле планировщика без запуска каких-либо рабочих процессов на том же узле, что и планировщик, у него 128 ГБ памяти? Любые идеи, как я могу обойти это или если я делаю что-то не так? код ниже.

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 за раз, и мне не хватает памяти.


person David saffo    schedule 13.07.2017    source источник
comment
Каковы размеры df здесь и откуда pred? Я отмечаю, что df должен быть глобальным, включенным в закрытие функции, и что ваш код очень зацикленный, так что его, вероятно, можно переписать с помощью лучших методов pandas.   -  person mdurant    schedule 14.07.2017
comment
Вы можете попробовать e.scatter(df) и передать df в сигнатуре функции, чтобы не копировать ее непосредственно в графе X раз.   -  person mdurant    schedule 15.07.2017


Ответы (2)


Вы говорите компьютеру оставить почти 1000 ГБ памяти.

Но вы и так это знали (:

person xmadscientist    schedule 13.07.2017

Как Мэри сказала выше, каждый вызов channel_select создает и сохраняет кадр данных в памяти планировщика, с 30 субъектами, вызывающими по 14 раз каждый, и кадром данных размером 2 ГБ ... да, вы можете сделать математику того, сколько памяти пытался захватить.

person David saffo    schedule 14.07.2017