8 votos

sistema de seguimiento de vehículos en postgresql rendimiento

Estoy desarrollando un sistema de seguimiento de vehículos utilizando postgresql.

Cuando los datos proceden de dispositivo a mi servidor de DB, estoy llamando a las siguientes funciones después de insertar datos en la tabla de registro.

  1. Distancia Update -- recoger la última fila insertada (latitud, longitud) del dispositivo específico de la tabla de registro y cálculo de la distancia con la fila recién insertada... la actualización de la distancia en la misma mesa

  2. Función de disparo -- obtiene la lista de todos los lugares'(estaciones) de latitud, la longitud, la radio y el nuevo cálculo de la distancia [mediante esta soy capaz de conseguir los detalles de su viaje, fecha de inicio y fin del viaje fecha y la inserción de los datos en anotehr tabla]

  3. Geofrontera funciones

  4. La función de exceso de velocidad

  5. algunas otras funciones

Voy a tener casi 2000 filas por minuto.

Será este golpe de rendimiento de mi ... de lo contrario necesito para escribir el detonante de esta...

¿Qué sucede si los datos aumenta en la tabla de más de 10,00,000... porque estamos recogiendo el último insertado los datos basados en el dispositivo cada vez?

Puedo conseguir cualquier db esquema básico de seguimiento de vehículos?

Gracias de antemano, AJ

9voto

mcchots Puntos 329

Esto no escala, que empecé hace 7 años con una aplicación haciendo seguimiento de vehículos.

Tengo 3500 de esos activos ahora, imaginar la inserción de 1 registro al mismo tiempo. Esta fue una pesadilla, especialmente cuando GPRS comms fracasado a nivel del proveedor y todas las actualizaciones en espera, cada dispositivo tiene 50 registros para enviar....

Ahora mantener todos los datos en sqlite archivos por imei, y no se sirve con un servidor http (aunque se habla de http), pero con una costumbre servidor TCP. La razón es:

  • escalabilidad junto con haproxy
  • la sobrecarga de datos a través de GPRS cuesta dinero. Así que cada servidor de encabezado que innecesariamente enviar de vuelta va a terminar en nuestro GSM proyecto de ley.

Usted debe separar la lógica (por ejemplo, clientes, dispositivos) y todo lo que mueve tu sitio lejos de donde los eventos de los seguidores.

He aquí un esquema básico que las escalas (sqlite archivo POR única imei):

CREATE TABLE Event_customerx_all (
  record_id INTEGER PRIMARY KEY,
  com_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  gps_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  imei bigint(20) NOT NULL,
  switch unsigned int(3) NOT NULL,
  event_id unsigned int(5) NOT NULL,
  latitude unsigned int(10) NOT NULL,
  longitude unsigned int(10) NOT NULL,
  IO unsigned int(3) NOT NULL,
  raw_data BLOB NOT NULL,
  sys_parsed int(3) DEFAULT NULL,
  UNIQUE (imei,raw_data) ON CONFLICT IGNORE
);

Y es simple en diseño. raw_data es de 33 bytes de nuestros eventos, esta es una costumbre compresion, cada paquete es grande, máximo de 42 eventos pueden ser enviados (el dispositivo utiliza el método GET).

El uso de una clase personalizada que se puede extraer más información, como el gps, los sats en la vista fija o sats, distancia, velocidad .... etc pero realmente no se necesita a 'descomprimir' todo cuando se trata de en. Los demás datos (event_id, interruptor, gps_date etc), en realidad es también extraíbles en raw_data. Desempaquete cuando usted lo necesita.

ahora, ¿por qué es tan bueno? bien, este escalas, imagina que inventar una nueva var, ahora lo que necesita para cambiar el esquema al 'extraer' todos ellos. Pero en este caso, el software toma el cuidado de él, como su clase será capaz de extraer ese detalle del evento.

La aplicación será, básicamente, siempre queremos hacer en (general) para la mayor parte:

  • Seleccione la última de la información
  • Seleccione un rango de fechas (por ejemplo, viaje/pista).

La mayoría se ubican en estas 2. Así también mantener su posición más reciente (y tal vez el último evento interesante como el start/stop, como yo lo hago ...) por separado cuando se trata de.

En esta aplicación, interruptor y event_id le hacen capaz de averiguar a qué tipo de raw_data tiene, ya que en algunos eventos no tienen coordenadas, usted querrá para filtrar aquellos cuando el dibujo de un mapa, tal vez no, si usted está creando un informe....

No escriba un disparador para esta... Muy mala idea. Lo que me explique anteriormente, se ha sustituido este tipo de diseño. Y a todos aquellos 3500 clientes son recibidos por una de 8Gb Linode VPS.

Hay mucho más, pero no cometer este error le ganará años si se trata de un grave aplicación que estamos hablando. Eres bienvenido ;-)

2voto

naknode Puntos 143

Usted va a necesitar hacer algunas de indexación en el dispositivo identificador de atributo y latlng atributo como el escaneo de la tabla será más lento con gran cantidad de filas. ¿Por qué no utilizar una tabla auxiliar para celebrar el último dispositivo que se inserta la fila? Postgresql ofrece varios tipos de índice para resolver velocidad lenta de los casos.

También los grandes viajes puede ser más lento para calcular debido a la gran cantidad de lugares de su función deberá ubicar. Bueno, yo no sabía de sus datos, pero usted debe debe tener estas cosas en mente y una gran cantidad de memoria ayudará a postgres encontrar las cosas más rápido sin hacer escrituras en disco.

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