Pregunta

Tengo una variedad de datos de series temporales almacenados en una cuadrícula más o menos georreferenciada, p.un valor por 0,2 grados de latitud y longitud.Actualmente los datos se almacenan en archivos de texto, por lo que en el día del año 251 es posible que veas:

251
 12.76 12.55 12.55 12.34 [etc., 200 more values...]
 13.02 12.95 12.70 12.40 [etc., 200 more values...]
 [etc., 250 more lines]
252
 [etc., etc.]

Me gustaría elevar el nivel de abstracción, mejorar el rendimiento y reducir la fragilidad (por ejemplo, ¡el código actual no puede insertar un día entre dos días existentes!).Habíamos jugado con hacks de BLOB-y RDBMS e incluso replicamos cada línea del formato de archivo de texto como una fila en una tabla (una fila por par de marca de tiempo/latitud, una columna por incremento de longitud, ¡sí!).

Podríamos ir a una geodatabase "real", pero la sobrecarga de etiquetar cada valor individual con una latitud y una longitud parece prohibitiva.El tamaño y la resolución de los datos no han cambiado en diez años y es poco probable que lo hagan.

He estado intentando poner todo en archivos NetCDF, pero creo que debemos superar por completo la mentalidad de archivo. Odio que todo mi software tenga que descifrar los nombres de los archivos a partir de fechas, manejar múltiples archivos durante varios años, etc. .La alternativa, poner los datos de los diez años (y contando) en un solo archivo, tampoco parece viable.

¿Alguna idea o producto brillante?

¿Fue útil?

Solución

He reunido tus comentarios aquí:

  1. Me gustaría hacer todo esto "sin escribir mi propio código de E/S de archivo"
  2. Necesito acceso desde "Java Ruby MATLAB" y "rutinas FORTRAN"

Cuando los suma, definitivamente no desea un nuevo formato de archivo. Quédate con el que tienes.

Si podemos lograr que relaje su primer requisito, es decir, si está dispuesto a escribir su propio código de E/S de archivos, entonces existen algunas opciones interesantes para usted.Escribiría clases de C++ y usaría algo como SWIG para que tus nuevas clases estén disponibles en los múltiples idiomas que necesitas.(Pero no estoy seguro de que puedas usar SWIG para tener acceso desde Java, Ruby, MATLAB y FORTRAN.Quizás necesites algo más.Yo mismo no estoy muy seguro de cómo hacerlo).

También dijiste: "En realidad, si tengo que tener archivos, prefiero el texto porque así puedo ingresar y editar manualmente cuando sea necesario".

Mi opinión es que se trata de una afirmación equivocada.Si estuviera dispuesto a crear sus propias rutinas de E/S de archivos, entonces hay cosas muy inteligentes que podría hacer...Y como último recurso, podrías contar con una herramienta que convierta del nuevo formato de archivo al mismo formato de texto antiguo al que estás acostumbrado...Y otra herramienta que vuelve a convertir.Volveré a esto al final de mi publicación...

Dijiste algo que quiero abordar:

"aprovechar 40 años de optimización de bases de datos"

Las bases de datos están destinadas a datos relacionales, no a datos ráster.No aprovecharás la base de datos de nadie optimizaciones con este tipo de datos.Es posible que puedas meter tus datos en una base de datos, pero eso no es lo mismo.

Esto es lo más útil que puedo decirte, basándome en todo lo que nos has contado. Tu dices esto:

"Estoy más interesado en optimizar mi ¡Más tiempo que el de la CPU, aunque la velocidad ejecutiva es buena!"

Francamente, esto requerirá HERRAMIENTAS.Deja de pensar en ello como un archivo de texto.Empiece a pensar en las tareas comunes que realiza y escriba pequeñas herramientas, en CUALQUIER IDIOMA, para que hacer esas cosas sea TRIVIAL.

¿Y si tus herramientas resultan tener un pésimo rendimiento?Adivina qué: es porque tu archivo de texto plano tiene un formato deficiente.Pero esa es solo mi opinión.:)

Otros consejos

Definitivamente cambiaría de texto a binario, pero mantendría cada día en un archivo separado.Puede nombrarlos de tal manera que las inserciones intermedias no causen ninguna extrañeza con los índices, como incluir la fecha y la posible hora en el nombre del archivo.También podría considerar la estructura del archivo si tiene varios campos por ubicación, por ejemplo.¿Es común buscar un mosaico pequeño en una gran cantidad de pasos de tiempo?En ese caso, es posible que desees almacenarlos como mosaicos que contengan datos de varios días.No mencionaste cómo se accede a los datos, lo que juega un papel importante en cómo organizarlos de manera eficiente.

Aclaraciones:

Me sorprende que haya agregado "base de datos" como una de las etiquetas y la haya considerado como una opción.¿Por qué hiciste esto?

Básicamente, tiene una imagen de punto flotante 2D de un solo componente en cada paso.¿Estarías de acuerdo con esta forma de ver tus datos?

También mencionó el deseo de insertar un día entre dos días existentes, lo que parece algo muy extraño.¿Por qué necesitarías hacer eso?¿Hay algún nuevo día entre el 4 y 5 de mayo del que no sé?

¿La "compresión" es una de las cosas que le importan o simplemente está harto de las limas planas?

¿Un float o un double serían suficientes para almacenar sus datos, o cree que necesita una precisión más arbitraria?

Además, ¿con qué lenguaje(s) de programación desea acceder a estos datos?

su respuesta sobre cómo almacenar los datos depende completamente de lo que vaya a hacer con los datos.por ejemplo, si solo necesita recuperar especificando la fecha o un rango de fechas, entonces almacenar en una base de datos como BLOB tiene algún sentido.pero si necesita encontrar registros que tengan ciertos valores, deberá hacer algo diferente.

describa cómo necesita poder acceder a los datos/

Matt, muchas gracias, y también Longneck y Jirv.

Esta publicación fue en parte un experimento que probó la calidad del discurso de stackoverflow.Si ustedes, chicos/chicas/formas de vida alienígenas son representativos, estoy vendido.

Y precisamente, has aclarado considerablemente mi pensamiento.Eso sí, es posible que todavía no necesariamente implementar tu consejo, pero sé que lo estaré pensamiento al respecto muy en serio.>;-)

Es muy posible que deje el mismo formato de archivo y lo agregue a las rutinas C y/o Ruby existentes para agregar las pocas características de bajo nivel que me faltan (p. ej.insertando pasos de tiempo faltantes) y colgar una interfaz HTTP en todo el sistema para que los datos puedan ser consumidos por cualquier caja que los necesite, en cualquier idioma que esté actualmente en uso.Si bien es en su mayoría software heredado inmutable el que construye estos datos, siempre encontramos nuevos consumidores para ellos, por lo que el requisito de múltiples idiomas y múltiples computadoras (caramba, ¿lo olvidé?) se aplica al lado de la lectura, no el lado de la escritura.Esto también evita una gran cantidad de problemas de seguridad.

Gracias de nuevo, amigos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top