В какой момент я использую слишком много памяти на Mac?

Я очень старался понять, почему мой питон использует 8 гигабайт памяти. Я даже использовал gc.get_object() и измерил размер каждого объекта, и только один из них был больше 10 мегабайт. Тем не менее, все объекты, а их было около 100 000, добавили до 5,5 гигабайт. С другой стороны, мой компьютер работает нормально, и программа работает с разумной скоростью. То, что я использую так много памяти, вызывает беспокойство? введите описание изображения здесь

Всего 1 ответ


Как сказал @bnaecker, это не простой ответ (то есть да / нет). Проблема только в том случае, если объединенный RSS (размер резидентного набора) всех запущенных процессов превышает доступную память, вызывая чрезмерную подкачку страниц.

Вы не сказали, как вы рассчитали размер каждого объекта. Надеемся, что это было sys.getsizeof() с помощью sys.getsizeof() который должен точно включать издержки, связанные с каждым объектом. Если вы использовали какой-либо другой метод (например, вызов __sizeof() напрямую), тогда ваш ответ будет намного ниже правильного значения. Однако даже sys.getsizeof() не будет учитывать потерянное пространство из-за выравнивания памяти. Например, рассмотрим этот эксперимент (используя python 3.6 в macOS):

In [25]: x='x'*8193

In [26]: sys.getsizeof(x)
Out[26]: 8242

In [28]: 8242/4
Out[28]: 2060.5

Обратите внимание на это последнее значение. Это означает, что объект использует 2060 и 1/2 слова памяти. Что неверно, так как все выделения потребляют кратные слова. На самом деле, мне кажется, что sys.getsizeof() неправильно учитывает выравнивание и заполнение слов либо базового объекта, либо структуры данных, описывающей объект. Это означает, что значение меньше объема памяти, фактически используемого объектом. Умножается на 100 000 объектов, которые могут представлять значительный объем памяти.

Кроме того, многие распределители памяти округляют большие выделения до размера страницы (обычно кратного 4 КиБ). Что приводит к «потраченному впустую» пространству, которое, вероятно, не будет включено в возвращаемое значение sys.getsizeof() .


Есть идеи?

10000