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