29 votos

¿Hay alguna forma de utilizar un almacén de clave-valor para los datos geoespaciales?

He utilizado muchas bases de datos relacionales en el pasado, pero también he leído sobre todas las bases de datos NoSQL, y los almacenes de clave-valor parecen interesantes.

Cuando almaceno un objeto geométrico utilizo principalmente cinco columnas indexadas ID, MIN_X, MAX_X, MIN_Y y MAX_Y (donde X e Y están en una proyección de mapa). No necesito un índice en mis otros datos.

Necesito los valores X e Y para buscar objetos en un lugar especificado (rectángulo del mapa), y necesito el valor ID si quiero actualizar un objeto especificado.

¿Hay alguna forma de utilizar un almacén de claves y valores para esto?

19voto

Scott Cowan Puntos 1564

Utilizamos Google AppEngine para ejecutar consultas espaciales/de atributos y el principal problema (desde el primer día) es cómo indexar grandes conjuntos de líneas/polígonos de tamaño arbitrario. Los datos de puntos no son demasiado difíciles (véase geohash, geomodel, etc.), pero los conjuntos de polígonos pequeños/grandes agrupados aleatoriamente siempre han sido un problema (y, en algunos casos, lo siguen siendo).

He probado varias versiones diferentes de indexación espacial en GAE, pero la mayoría son sólo variantes de dos de ellas. Ninguna es tan rápida como las bases de datos SQL y todas tienen ventajas e inconvenientes. Además, los dos siguientes deben combinarse con la selección de la geometría en memoria (a través de JTS, etc.) para eliminar cualquier característica que no se ajuste a los parámetros de búsqueda finales y, por último, se basan en las características específicas de GAE, pero estoy seguro de que podría aplicarse a otras arquitecturas (o utilizar TyphoonAE para ejecutar en un clúster de Linux, ec2, etc.)

Rejillas - Empaquetar todas las características de una zona determinada en un índice de cuadrícula conocido. Coloque un pequeño índice espacial en la cuadrícula para poder navegar rápidamente por el conjunto de características que contiene. Para la mayoría de las consultas, sólo tendrá que sacar un puñado de cuadrículas, lo cual es rápido, ya que conoce la convención exacta de nomenclatura de las cuadrículas y su relación con las entidades K/V (obtiene, no consulta)

Pros - Bastante rápido, fácil de implementar, no ocupa memoria.

Cons - es necesario el preprocesamiento, el usuario tiene que decidir el tamaño de la cuadrícula, los geoms grandes se comparten en varias cuadrículas, la agrupación puede hacer que las cuadrículas se sobrecarguen, los costes de serialización/deserialización pueden ser un problema (incluso cuando se comprimen mediante búferes de protocolo)

QuadKeys - Esta es la implementación actual. Básicamente es lo mismo que Grids, excepto que no hay un nivel de rejilla establecido. a medida que se añaden características, se indexan por la rejilla quadkey que contiene completamente sus límites (o en algunos casos, se divide en dos cuando una sola quadkey no se puede utilizar, piense en la línea de tiempo). Una vez encontrada la qk, se divide en un número máximo de qk más pequeñas que proporcionan representaciones de grano más fino de la característica. un puntero/caja a esa característica se empaqueta entonces en un gridindex ligero (grupo de características) que puede ser consultado (un diseño original consultaba las características directamente pero esto resultó ser demasiado lento/intensivo para la CPU en los casos en que el conjunto de resultados era grande)

Polilínea Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png Polígono Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png

La convención de nomenclatura quadkey utilizada anteriormente es bien conocida y, lo que es más importante, tiende a preservar la localidad (descrita más aquí )

El polígono anterior tiene un aspecto similar al siguiente: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 032010101313003 032010101313012 032010101313013 03201010131312 03201010131313 032010101313102 ...

si los límites de la consulta son lo suficientemente pequeños, se puede obtener directamente a través del qk. esto es óptimo, ya que es sólo una llamada rpc por lotes al almacén de datos de GAE. si los límites son lo suficientemente grandes como para incluir demasiados qks posibles (>1000), entonces se puede consultar alternativamente utilizando un filtro (por ejemplo: qk >= 0320101013 y qk <= 0320101013 + \ufffd ). La convención de nomenclatura quadkey y la forma en que GAE indexa las cadenas permiten que la consulta anterior obtenga sólo el existente rejillas que están por debajo de ese valor qk.

hay otras advertencias y problemas de rendimiento, pero en general, es la capacidad de consulta en las quadkeys lo que hace que sea factible

ejemplos - consulta sobre los condados de Estados Unidos: geojson

Pros - Bastante rápido, sin configurar el tamaño de la rejilla, sin ocupar la memoria, sin abarrotar las rejillas

Cons - se necesita un preprocesamiento, posible sobrecarga en algunos escenarios, no hay datos polares

Curvas de llenado de espacios - Echa un vistazo a Charla de Alfred sobre NextGen Queries en Google I/O este año. La inclusión de curvas genéricas de llenado de espacio/tiempo junto con los nuevos operadores MultiQuery (que se ejecutan en paralelo) permitirán realizar algunas consultas espaciales realmente interesantes. ¿Superará el rendimiento del SQL tradicional? Es difícil de decir, pero debería escalar muy bien. Además, nos acercamos rápidamente a un futuro en el que los dispositivos móviles de todas las formas y tamaños aumentarán drásticamente el tráfico de su sitio o servicio.

Por último, también estoy de acuerdo en que hay que analizar muy bien el dominio del problema antes de elegir NoSQL en lugar de SQL. En nuestro caso, me gustó mucho el modelo de precios de GAE, así que realmente no había elección, pero si no necesitas escalar, ahórrate algo de tiempo y utiliza una base de datos sql estándar.

11voto

Anonymous User Puntos 942

He oído hablar de GeoCouch, que es una implementación de CouchDB para datos basados en la localización. Y también creo que MongoDB tiene capacidades de indexación geoespacial.

8voto

EndangeredMassa Puntos 9532

Se trata principalmente de una cuestión de algoritmos. Stack Overflow también puede ser un buen lugar para preguntar.

En cualquier caso, la respuesta a tu pregunta directa es "sí, puedes usar un almacén kvp para representar datos espaciales". Sin embargo, una pregunta mejor podría ser "¿debería usar un almacén kvp para representar datos espaciales?"

La respuesta a esta pregunta (como a muchas otras) es: "depende". Depende de tu escala, de tu carga de trabajo (transaccional), de la naturaleza de los datos y de la infraestructura informática que tengas a tu disposición.

Un almacén kvp tendrá una baja sobrecarga, lo que puede ayudar a aumentar el rendimiento para altos volúmenes de paralelismo de inserción y actualización. Sin embargo, no será muy rápido para realizar búsquedas espaciales (encontrar todos los objetos dentro de un rectángulo). Para eso se necesita un índice espacial, como un árbol R.

Sin embargo, si tienes un volumen de datos realmente grande, y un enorme cluster de ordenadores, entonces el uso de un índice kvp podría proporcionar algunos beneficios de perormance. La única forma de saberlo con certeza es realizar mediciones de rendimiento utilizando los datos reales y los patrones de acceso que esperas encontrar.

Actualización :

Aquí tienes un poco más de información. Puedes usar un almacén KVP para hacer búsquedas espaciales. El problema es que es lento. Para ver por qué, considere algo como esto:

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

Donde * y # representan objetos, dispuestos en una cuadrícula de 11x11, con el origen en la esquina superior izquierda. Imagina una búsqueda de objetos dentro del rectángulo (4,4)-(7,7). Eso debería encontrar todos los "#". Asumiendo que está usando un árbol b+ para representar sus índices en el almacén KVP, podría encontrar los resultados usando el índice "X" o el índice "Y". En este caso, no importa cuál. Por el bien de la discusión, usaré el índice "X". Usted haría una búsqueda log(n) en el índice X para encontrar el primer nodo con un valor X de "4" y luego iteraría a través de los nodos hoja del árbol b+ hasta encontrar un nodo con un valor mayor a 7. Al iterar por el índice x, se rechazaría todo lo que estuviera fuera del rango y deseado.

Esto es lento. Imagínese en una cuadrícula grande, con la misma densidad, digamos 100 K * 100 K. Allí terminaría teniendo que escanear "300, 000" entradas de índice para encontrar sólo 9 registros. Sin embargo, si se utiliza un árbol R correctamente equilibrado, la búsqueda en el índice probablemente sólo tendría que escanear unos 90 registros. Es una gran diferencia.

El problema, sin embargo, es que mantener un árbol R equilibrado es caro. Por eso la respuesta es "depende", y por eso la pregunta "¿debo hacerlo?" es mucho más importante que "¿cómo lo hago?".

Si insertas y eliminas muchos registros, y realizas principalmente la búsqueda de "ID de objeto", y no realizas frecuentemente la búsqueda "espacial", entonces el uso de tu índice KVP te dará un mejor rendimiento para lo que realmente quieres utilizar el sistema. Sin embargo, si insertas o borras con poca frecuencia, pero haces muchas búsquedas espaciales, entonces querrás usar un R-Tree.

4voto

jonesdavide Puntos 176

Si utiliza valores de latitud y longitud, puede utilizar geohashes como la parte de valor de su tienda.

Aquí hay uno para la ciudad de Nueva York. dr5regy6rc6ye

Con el geohash, puedes empezar a eliminar caracteres al final del geohash para obtener una cuadrícula de mayor o menor precisión: http://geohash.org/dr5re

Ejemplo de implementación de js: http://github.com/davetroy/geohash-js

1voto

Chris Jester-Young Puntos 102876

Echa un vistazo a esta aplicación GAE que serializa STC geometría a BigTable . Puede que lo adopte para otros Motores de almacenamiento NoSQL .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X