2013-07-02 8 views
6

Мне интересно узнать об увеличении общего размера кучи python при загрузке большого объекта. heapy, кажется, то, что мне нужно, но я не понимаю результатов.Измерение увеличения размера кучи после загрузки большого объекта

У меня есть файл соленья 350 МБ с пандами DataFrame, в котором содержится около 2,5 миллионов записей. Когда я загружаю файл и потом проверяю кучу с heapy, он сообщает, что в кучу добавлено только около 8 МБ объектов.

import guppy 
h = guppy.hpy() 
h.setrelheap() 
df = pickle.load(open('test-df.pickle')) 
h.heap() 

Это дает следующий результат:

Partition of a set of 95278 objects. Total size = 8694448 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 44700 47 4445944 51 4445944 51 str 
    1 25595 27 1056560 12 5502504 63 tuple 
    2 6935 7 499320 6 6001824 69 types.CodeType 
... 

Что меня смущает является Total size из 8694448 bytes. Это всего лишь 8 МБ.

Почему Total size не отражает размер целого DataFramedf?

(Использование Python 2.7.3, бесформенный 0.1.10, Linux 3.2.0-48-родовой-пай (Ubuntu), i686)

ответ

0

Вы можете попробовать pympler, который работал на меня в последний раз я проверил , Если вас просто интересует общее увеличение памяти, а не для определенного класса, вы можете указать конкретный вызов ОС для получения общей используемой памяти. Например, в ОС на основе UNIX вы можете сделать что-то вроде следующего до и после загрузки объекта, чтобы получить diff.

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
+0

Спасибо за ваш ответ. Я еще не добрался до пылесоса - попробуй его в ближайшие дни. Представление OS о потреблении памяти не то, что меня интересует, поэтому getrusage() не поможет в моем случае. – rodion

0

У меня была аналогичная проблема, когда я пытался выяснить, почему мои 500-мегабайтные CSV-файлы занимают до 5 ГБ в памяти. Pandas в основном строится поверх Numpy и поэтому использует C malloc для выделения пространства. Вот почему он не отображается в heapy, который только профилирует чистые объекты Python. Одним из решений может быть просмотр valgrind для отслеживания утечек памяти.

Смежные вопросы