¿Por qué los pepinillos comen la memoria?

Intento lidiar con la escritura de una gran cantidad de datos encurtidos en un disco por partes pequeñas. Aquí está el código de ejemplo:

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)

Abra () y cierre () colocado dentro del bucle para excluir posibles causas de acumulación de datos en la memoria.

Para ilustrar el problema adjunto los resultados de los perfiles de memoria obtenidos con el módulo 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()

Durante la ejecución del bucle se produce un crecimiento de uso de memoria extraña. ¿Cómo se puede eliminar? ¿Alguna idea?

Cuando la cantidad de datos de entrada aumenta, el volumen de estos datos adicionales puede crecer hasta un tamaño mucho mayor que la entrada (actualización: en la tarea real obtengo 300 + Mb)

Y una pregunta más amplia: ¿qué formas existen para trabajar correctamente con grandes cantidades de datos de IO en Python?

actualizacion: Reescribí el código dejando solo el cuerpo del bucle para ver cuándo ocurre el crecimiento específicamente, y aquí están los resultados:

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

Parece que los vertederos () se comen la memoria. (Mientras que en realidad pensé que sería escribir ())