Зачем мариновать кушать память?

Я пытаюсь записать огромное количество засоленных данных на диск небольшими порциями. Вот пример кода:

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 () и close () размещены внутри цикла, чтобы исключить возможные причины накопления данных в памяти.

Чтобы проиллюстрировать проблему, я прилагаю результаты профилирования памяти, полученные с помощью модуля Python 3d party.memory_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()

При выполнении цикла происходит странное увеличение использования памяти. Как это можно устранить? есть идеи?

Когда количество входных данных увеличивается, объем этих дополнительных данных может вырасти до размера, намного превышающего входной (upd: в реальной задаче я получаю 300+ Мб)

И более широкий вопрос - какие существуют способы для правильной работы с большими объемами данных ввода-вывода в Python?

UPD: Я переписал код, оставив только тело цикла, чтобы увидеть, когда происходит конкретный рост, и вот результаты:

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()

Кажется, что dumps () ест память. (Пока я на самом деле думал что напишу ())

Ответы на вопрос(1)

Ваш ответ на вопрос