проблема памяти рекурсии Python - PullRequest
0 голосов
/ 12 ноября 2018

ОБНОВЛЕНИЕ: я добавил оператор print во время функции merge_dictionaries, как показано ниже.Я вижу, что рекурсивная функция опускается до глубины 79 и резервируется сотни раз, поскольку она объединяет словари.Длина inspect.stack () постоянно достигает значения 173 на самой глубокой глубине, поэтому я не думаю, что происходит безудержная рекурсия.Сбой может произойти, когда функция выполняется на любой глубине, и она никогда не находится в самой глубокой точке рекурсии.Мне кажется, что происходит некое состояние или сборка мусора, которая не происходит.Кто-нибудь знает дальнейшие действия для root, вызывающего это или решающего мое использование беглой памяти?

Я пытаюсь объединить две структуры три.Функция слияния ниже.Глубина каждого дерева равна 80, а количество терминальных узлов в каждом ~ 100k.Я выполняю слияние на 128-Гбайт Linux-боксе и постоянно исчерпываю память во время слияния.

Они не кажутся мне чрезмерно большими.Есть ли способ уменьшить использование памяти или есть что-то фундаментальное в моей структуре три или функции слияния, которая вызывает потребление такого большого количества памяти?Все ключи хорошо работают (строки менее 50 символов), а размер файлов json, в которых хранятся попытки, составляет ~ 500 МБ.

def merge_dictionaries(master, slave, depth):
    if len(slave.keys()) == 0:
        return {}
    print(str(depth) + ':' + str(len(inspect.stack()))
    for key in slave.keys():
        if key not in master.keys():
            master[key] = slave[key]
        else:
            master[key] = merge_dictionaries(master[key], slave[key], depth + 1)
    return master
...