Processing math: 100%

9 votos

Consultas a volver muy grandes conjuntos de datos en PostGIS

Tengo un PostGIS consulta que devuelva varios millones de filas:

SELECT 
 t1.id AS id1,
 t2.id AS id2,
 ABS(t1.mean_h - t2.mean_h) AS h_diff, 
 ST_Distance(t1.the_geom, t2.the_geom) AS dist  
FROM tas_ponds as t1, tas_ponds as t2 
WHERE
 (t1.gid > t2.gid) AND
 ST_DWithin(t1.the_geom, t2.the_geom, 17000)

Cuando se ejecuta en psql, puedo obtener un out of memory for query result de error.

Google sugiere que esta un error dentro de psql en lugar de postgres/PostGIS. Tendría que modifica la consulta en el formulario SELECT ... INTO x FROM ... solucionar el problema? Hay otros enfoques recomendados para tratar con conjuntos de datos muy grandes?

8voto

Robert Höglund Puntos 5572

Algunos hurgando hace confirmar que esta es una Postgres problema de los clientes, independiente de ordenación del territorio o las consideraciones de servidor: el cliente dispone de una cantidad limitada de memoria buffer de los resultados antes de mostrarlos en la pantalla, que te estás excediendo.

El método recomendado para controlar este es el uso de DECLARAR / FETCH enfoque para acceder a los datos en bloques más pequeños que el conjunto total de resultados. También podría crear una vista con los componentes de la consulta (por ejemplo, distancia) para reducir la memoria necesaria para la operación de la consulta en sí.

5voto

skfd Puntos 463

scw me consiguió por dos minutos, así que no voy a repetir su respuesta. Aquí están algunas otras posibles soluciones:

  • Editar el Memory sección postgresql.conf. Tratar de ver si usted tiene muy poca memoria ajustes que pudieran impedir la consulta de ejecución.

  • Trate de escribir la consulta en un archivo y se ejecuta desde la línea de comandos, usando:

    psql -f filename db_name > output_file

  • Si usted va a utilizar los resultados en una aplicación externa, intente Ejecutar la consulta utilizando el cursor desde el exterior psql. Por ejemplo, una secuencia de comandos de Python que se ejecuta la consulta:

secuencia de comandos:

try:
    conn = psycopg2.connect("dbname='' user='' host='' password=''") # Fill in
    cur = conn.cursor()
except:
        print 'Unable to connect to the database'
else:
        print 'Connected to database.'

query="""YOUR
         QUERY
         HERE"""
cur.execute(query)

Un cursor es iterable, por lo que puede:

for result in cur:
    print result

O llegar a todos ellos:

 results=cur.fetchall()

2voto

akdom Puntos 6724

Para el registro, en mi caso de almacenar el conjunto de datos devuelto en otra tabla con el SELECT ... INTO ... sintaxis trabajado.

No sólo solucionó el problema de la memoria, pero también era considerablemente más rápido que la consulta original.

1voto

Erik Öjebo Puntos 6937

La indexación es muy importante en Postgres y PostGIS

http://postgis.refractions.net/docs/ch04.html#id2794434

Recomendamos GiST (Generalizado de Búsqueda de Árboles) de los índices para conjuntos de datos muy grandes.... (también es "null seguro") ejemplo CREATE INDEX [indexname] EN [tablename] CON GIST ( [geometryfield] );

Después de la construcción de un índice, es importante fuerza de PostgreSQL para recopilar estadísticas de tabla, que se utilizan para optimizar los planes de consulta

VACÍO ANALIZAR [nombre_tabla] [nombre_columna]; SELECCIONE UPDATE_GEOMETRY_STATS([nombre_tabla], [nombre_columna]);

también una buena referencia es: Tomar Ventaja de los Índices http://postgis.refractions.net/docs/ch04.html#id2794685

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