Использование памяти Python для временных процессов? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую эту функцию, которую я нашел в Интернете по адресу: http://fa.bianp.net/blog/2013/different-ways-to-get-memory-consumption-or-lessons-learned-from-memory_profiler/

def memory_usage_psutil():
    # return the memory usage in MB
    import psutil
    process = psutil.Process(os.getpid())
    mem = process.memory_info()[0] / float(2 ** 20)
    return mem

Кажется, это работает отлично, однако я озадачен одним вопросом.Допустим, у нас есть такой сценарий:

def create_giant_list(num):
    A = []
    for i in range (num):
        row = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k']
        A.append(row)
    return A

A = create_giant_list(10000000)  # Some HUGE list (Could contain larger sized objects though)

print("BEFORE: " + str(memory_usage_psutil()) + " MB")

test = [x for x in A]  # List comprehension creates a new list!! More memory...

print("AFTER: " + str(memory_usage_psutil()) + " MB")

Ничего себе, мы получили хорошие результаты:

BEFORE: 173.66015625 MB
AFTER: 178.9921875 MB

Однако как насчет памяти, которая не назначена переменной?

print("BEFORE: " + str(memory_usage_psutil()) + " MB")

print([x for x in A])

print("AFTER: " + str(memory_usage_psutil()) + " MB")

Здесь мы просто печатаем список, а не присваиваем его переменной, которая была бы сохранена в памяти для нашей программы.

AFTER: 163.0078125 MB
BEFORE: 163.0078125 MB

Бесполезные результаты ... так как мы неНа самом деле этот список не сохраняется в памяти, он сразу же отбрасывается после печати.Но в какой-то момент этот список действительно существует и потребляет память, верно?Даже если это было временно.

Вопрос: Можно ли как-нибудь просмотреть память, которая временно используется?Я предполагаю, что особенно для больших наборов данных это может серьезно повлиять на память, но у меня возникают трудности с проверкой этого.

Почему: Я пересматривал понимание списков по сравнению с генераторами.Я знаю, что когда происходит понимание списка, он создает новый экземпляр результирующего списка.Это может быть опасно и занимать много памяти для больших наборов данных.Следовательно, генератор может быть полезен, чтобы избежать этого.Я хотел написать простую программу, демонстрирующую различия между двумя, показывающую различия в памяти и возможном времени выполнения.

...