Tamaño de un objeto en python

Joaquin Jose del Cerro Murciano jjdelcerromurciano en yahoo.es
Vie Jun 17 10:06:32 CEST 2005


Hola, 

Parece que lo que tienes es un problema de desconocimiento de las librerias de 
python. Por un lado lo que quieres hacer ya biene de base en la libreria de 
python. Se llama "shelve".  Permite guardar en un fichero objetos python y 
acceder de forma "directa" a ellos mediante una clave. Basicamente es una 
tabla de hash en disco con parejas de clave-valor donde el valor puede ser un 
objeto python (con sus limitaciones). Por debajo tira de pickle y dbm.
(No es un acceso directo al estilo seek sobre un fichero pero es de lo mejor 
que se puede conseguir).

http://docs.python.org/lib/module-shelve.html

Por otro lado, hablando de tu problema con "pickle.load", podrias llegar a 
usar "pickle.loads" en su lugar. Esto es, suponiendo que todas las 
instanacias de una clase, al ser serializadas con "pickle.dumps" tubieran el 
mismo tamaño, podrias ir almacenandolas con algo asi como:

f.seek(recordsize*index)
f.write(pickle.dumps(instance))

Y recuperarla de forma similar:

f.seek(recordsize*index)
obj = pickle.loads(f.read(recordsize))

Pero el problema es que todas las instancias de una clase no ocupan lo mismo 
al ser serializadas. Su tamaño a depender de su contenido. Supongamos una 
clase con una propiedad "nombre", y dos instancias. 
	a.nombre = "Pepe"
	b.nombre = "Luis Alfonso"
Cuando tiremos a serializarlas nos encontyraremos que "b" ocupa mas que "a", 
asi como 8 bytes mas.
Pensando con cadenas parece muy evidente, pero la cosa se puede complicarse 
mas cuando alguna propiedad de la clase es una lista, diccionario o una 
referecnia a otro objeto. e incluso te puedes encontrar instancias de la 
clase para las que la misma propiedad referencian a valores de tipos 
dispares. En consecuencia es muy dificil decir que tamaño van a tener las 
instancias de una clase al serializarlas con pickle.

En lo que respecta al uso de "sizeof" de C++, lo que estas viendo es una 
funcion heredada de un lengueje de programacion (el C) de muy bajo nivel. 
Realmente sizeof es una funcion que no tiene sentido aplicarla a 
clases/objetos, simplemente por concepto. No le deberias poder preguntar a un 
objeto cuanto ocupa su representacion en memoria.  El objeto encapsula y 
oculta esa informacion para que el programador no tenga que preocuparse por 
ello. En los lenguajes orientados a objetos (dejando aparte los que aparecen 
como una evolucion de los lenguajes de programacion funcional) no existe esa 
funcionalidad, simplermente por concepto. con python de vez en cuando aun te 
encuentras alguna cosilla que arrastra de los lenguejes funcionales, pero en 
general deberiamos considerarlo como un lenguaje orientado a objeto, y como 
tal no dispone de esa funcion.

Un saludo
Joaquin

		
______________________________________________ 
Renovamos el Correo Yahoo! 
Nuevos servicios, más seguridad 
http://correo.yahoo.es




Más información sobre la lista de distribución Python-es