Dlaczego marynuje pamięć?

Próbuję poradzić sobie z pisaniem dużych ilości marynowanych danych na dysk małymi kawałkami. Oto przykładowy kod:

from cPickle import *
from gc import collect

PATH = r'd:\test.dat'
@profile
def func(item):
    for e in item:
        f = open(PATH, 'a', 0)
        f.write(dumps(e))
        f.flush()
        f.close()
        del f
        collect()

if __name__ == '__main__':
    k = [x for x in xrange(9999)]
    func(k)

open () i close () umieścili wewnątrz pętli, aby wykluczyć możliwe przyczyny gromadzenia danych w pamięci.

Aby zilustrować problem, dołączam wyniki profilowania pamięci uzyskane w module Python 3d partymemory_profiler:

   Line #    Mem usage  Increment   Line Contents
==============================================
    14                           @profile
    15      9.02 MB    0.00 MB   def func(item):
    16      9.02 MB    0.00 MB       path= r'd:\test.dat'
    17
    18     10.88 MB    1.86 MB       for e in item:
    19     10.88 MB    0.00 MB           f = open(path, 'a', 0)
    20     10.88 MB    0.00 MB           f.write(dumps(e))
    21     10.88 MB    0.00 MB           f.flush()
    22     10.88 MB    0.00 MB           f.close()
    23     10.88 MB    0.00 MB           del f
    24                                   collect()

Podczas wykonywania pętli występuje dziwny wzrost wykorzystania pamięci. Jak można to wyeliminować? jakieś pomysły?

Gdy ilość danych wejściowych zwiększa objętość tych dodatkowych danych, może wzrosnąć do wielkości znacznie większej niż dane wejściowe (upd: w rzeczywistym zadaniu otrzymuję 300 + Mb)

I szersze pytanie - jakie istnieją sposoby poprawnej pracy z dużymi ilościami danych IO w Pythonie?

aktualizuj: Przepisałem kod, pozostawiając tylko ciało pętli, aby zobaczyć, kiedy rozwój następuje konkretnie, a tutaj wyniki:

Line #    Mem usage  Increment   Line Contents
==============================================
    14                           @profile
    15      9.00 MB    0.00 MB   def func(item):
    16      9.00 MB    0.00 MB       path= r'd:\test.dat'
    17
    18                               #for e in item:
    19      9.02 MB    0.02 MB       f = open(path, 'a', 0)
    20      9.23 MB    0.21 MB       d = dumps(item)
    21      9.23 MB    0.00 MB       f.write(d)
    22      9.23 MB    0.00 MB       f.flush()
    23      9.23 MB    0.00 MB       f.close()
    24      9.23 MB    0.00 MB       del f
    25      9.23 MB    0.00 MB       collect()

Wygląda na to, że dumps () zjada pamięć. (Podczas gdy faktycznie myślałem, że będzie to pisać ())

questionAnswers(1)

yourAnswerToTheQuestion