Tamaño de un objeto en python
luis miguel morillas
morillas en posta.unizar.es
Vie Jun 17 15:59:08 CEST 2005
Asunto: RE: [Python-es] Tamaño de un objeto en python
Fecha: vie, jun 17, 2005 at 11:14:46 +0200
Citando a Hernan Martinez Foffani (hernan en orgmf.com.ar):
> >>> Pregunto esto por que al leer sobre funciones de
> >>> entrada/salida desde archivos en python ,se me ocurrio
> >>> crear un modulo para el acceso aleatorio a los
> >>> registros de un archivo (en teoría un registro por
> >>> linea, aunque si conosco el tamaño de cada objeto
> >>> registro esto no importaría mucho) utilizando el
> >>> metodo seek() de un objeto archivo
> >>
> >> Me imagino que quieres guardar objetos arbitrarios
> >> en el archivo. ¿No te sirve pickle?
> >
> > Yo parto del supuesto de que el archivo ya fue creado
> > con pickle, y que en el se han guardado varios objetos
> > de la misma clase o tipo, entonces:
>
> Vaya.... Ahora sí.
>
> > si fuera el caso de que el archivo es demasiado grande
> > como para utilizar el metodo load (que si no entiendo
> > mal, carga todo el contendio de un archivo de una sola
> > vez), y reitero, en el archivo se ha almacenado mas de
> > un objeto (y no una lista de objetos)...
>
> No. load lee de a objetos completos. Puedes hacer
> varios load sobre un mismo stream abierto, así como podrías
> hacer varios dump seguidos. Es mas, es la única forma
> en que podría haber sido creado tu archivo.
> Si no fuera así, no sería posible recuperar un archivo
> previamente "pickleado".
>
> >>> import pickle
> >>> f = file("p", "w")
> >>> pickle.dump(3, f)
> >>> pickle.dump(4, f)
> >>> f.close()
> >>> f = file("p")
> >>> pickle.load(f)
> 3
> >>> pickle.load(f)
> 4
> >>> f.close()
> >>>
>
> > entonces sería posible acceder de manera directa a
> > cualquier objeto dentro del archivo con solo saber que
> > posición ocupa este objeto dentro de este.
>
> Repito, en python no es posible. Ni siquiera en caso que
> se trate de un archivo pickle. Si te fijas en el contenido
> del archivo (si supuestamente es un pickle de texto y no
> binario) verás que hasta un simple entero se serializa en
> datos de longitud variable con marca de terminación y no
> de tamaño.
>
> En tu caso, los "varios objetos" podrían ser instancias de clases
> que tengan atributos que son listas que incluyen números y
> cadenas. Cuando se serializan esos objetos tienen longitud
> variable dentro del archivo. La única manera de acceder
> al, digamos, décimo objeto es haber parseado los nueve
> anteriores. Para eso es mas facil hacer 10 loads y
> descartar los 9 primeros.
>
> Si tu aplicación necesita acceso indexado utiliza el
> módulo shelve en vez de pickle.
>
Eso mismo quería recomendar yo. Con shelve puedes usas el fichero como
si fuera un diccionario (las llamadas a cPickle las hace automáticas el
módulo)
Para un uso más intenso también es interesante el módulo ZODB, que tiene
soporte para BTrees, multihilo, transacciones ...
Salud,
--
Luis Miguel
No a las patentes de software en Europa
EuropeSwPatentFree
http://EuropeSwPatentFree.hispalinux.es
Más información sobre la lista de distribución Python-es