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