2011-02-18 17 views
10

Al almacenar y recuperar una entidad del almacén de datos que contiene una lista de tuplas, ¿cuál es la forma más eficiente de almacenar esta lista?¿Cuál es la forma más eficaz de almacenar una lista de Tuples en App-Engine?

Cuando he encontrado este problema, las tuplas pueden ser cualquier cosa, desde pares de valores clave hasta una fecha y resultados de muestra, hasta las coordenadas (x, y).
El número de tuplas es variable y varía de 1 a unos pocos cientos.

La entidad que contiene estas tuplas, necesitaría una referencia rápida/económica, y los valores de tupla no necesitan ser indexados.

He tenido este problema varias veces y lo he resuelto de diferentes maneras.

Método 1:

convertir los valores de tupla en una cadena y concatenar junto con algunos delimitador.

def PutEntity(entity, tuples): 
    entity.tuples = ['_'.join(tuple) for tuple in tuples] 
    entity.put() 

Ventajas: Los resultados son fáciles de leer en el Visor de almacén de datos, todo está recogen en un GET. Desventajas: Pérdida de precisión potencial, programador requerido para deserializar/serializar, se requieren más bytes para almacenar datos en formato de cadena.

Método 2:

tienda cada valor tupla en una lista y zip/descomprimir la tupla.

def PutEntity(entity, tuples): 
    entity.keys = [tuple[0] for tuple in tuples] 
    entity.values = [tuple[1] for tuple in tuples] 
    entity.put() 

Ventajas: Sin pérdida de precisión, confuso, pero todavía es posible ver los datos en el almacén de datos espectador, capaz de imponer tipos, todo se recogen en un GET.
Desventaja: programador necesita comprimir/descomprimir las tuplas o mantener cuidadosamente el orden en las listas.

Método 3:

serializar la lista de tuplas en algunos JSON Manor, salmuera, tampones de protocolo y lo almacenan en una burbuja de texto o propiedad.

Ventajas: Utilizable con objetos, y objetos más complejos, menos riesgo de que falle un error que coincida con los valores de tupla.
Desventajas: El acceso a la tienda de Blob requiere y recuperación adicional ?, no se pueden ver los datos en el Visor de Datastore.

Método 4:

tienda de las tuplas en otra entidad y mantener una lista de las teclas.

Ventajas: Arquitectura más obvia. Si la entidad es una vista, ya no necesitamos guardar dos copias de los datos de la tupla.
Desventajas: Dos búsquedas requieren una para la entidad y la lista de claves y una para las tuplas.

Me pregunto si alguien sabe cuál funciona mejor y si hay alguna manera en que no haya pensado.

Gracias, Jim

Respuesta

5

que utilizan el método 3. Blobstore puede requerir Traiga un extra, pero db.BlobProperty no lo hace. Para los objetos en los que es importante que salga del almacenamiento exactamente como se lo colocó, utilizo PickleProperty (que se puede encontrar en tipfy y algunas otras bibliotecas de utilidades).

Para objetos donde solo necesito que se almacene su estado, escribí una función JsonProperty que funciona de manera similar a PickleProperty (pero usa SimpleJson, obviamente).

Para mí, obtener todos los datos en una única búsqueda, y ser a prueba de idiotas, es más importante que el rendimiento de la CPU (en App Engine). De acuerdo con la charla de Google I/O en AppStats, un viaje al almacén de datos casi siempre será más costoso que un poco de análisis local.

+0

Tiendo a utilizar el método 3 con PickleProperty pero a veces no tener la opción de ver la entidad a través del Datastore Viewer puede ser doloroso. – systempuntoout

Cuestiones relacionadas