Ответ 1
Несколько вещей, чтобы указать:
-
В разделе "Проверка памяти после изменения размера" вы еще не удалили исходный DataFrame, так что это будет использование строго большего объема памяти
-
Интерпретатор Python немного жадн о том, что он удерживает память ОС.
Я просмотрел это и могу заверить, что pandas не утечка памяти. Я использую пакет memory_profiler (http://pypi.python.org/pypi/memory_profiler):
import time, string, pandas, numpy, gc
from memory_profiler import LineProfiler, show_results
import memory_profiler as mprof
prof = LineProfiler()
@prof
def test(nrow=1000000, ncol = 4, timetest = 5):
from_ = nrow // 10
to_ = 9 * nrow // 10
df = pandas.DataFrame(numpy.random.randn(nrow, ncol),
index = numpy.random.randn(nrow),
columns = list(string.letters[0:ncol]))
df_new = df[from_:to_].copy()
del df
del df_new
gc.collect()
test()
# for _ in xrange(10):
# print mprof.memory_usage()
show_results(prof)
И здесь вывод
10:15 ~/tmp $ python profmem.py
Line # Mem usage Increment Line Contents
==============================================
7 @prof
8 28.77 MB 0.00 MB def test(nrow=1000000, ncol = 4, timetest = 5):
9 28.77 MB 0.00 MB from_ = nrow // 10
10 28.77 MB 0.00 MB to_ = 9 * nrow // 10
11 59.19 MB 30.42 MB df = pandas.DataFrame(numpy.random.randn(nrow, ncol),
12 66.77 MB 7.58 MB index = numpy.random.randn(nrow),
13 90.46 MB 23.70 MB columns = list(string.letters[0:ncol]))
14 114.96 MB 24.49 MB df_new = df[from_:to_].copy()
15 114.96 MB 0.00 MB del df
16 90.54 MB -24.42 MB del df_new
17 52.39 MB -38.15 MB gc.collect()
Таким образом, в использовании больше памяти, чем при запуске. Но это утечка?
for _ in xrange(20):
test()
print mprof.memory_usage()
И вывод:
10:19 ~/tmp $ python profmem.py
[52.3984375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59375]
[122.59765625]
[122.59765625]
[122.59765625]
Итак, на самом деле то, что происходит, заключается в том, что процесс Python держится в пуле памяти, учитывая то, что он использует, чтобы избежать необходимости запрашивать больше памяти (а затем освобождать ее) от операционной системы хоста. Я не знаю всех технических деталей позади этого, но это по крайней мере то, что происходит.