Domanda

Ho una varietà di dati di serie temporali archiviati su una griglia più o meno georeferenziata, ad es.un valore per 0,2 gradi di latitudine e longitudine.Attualmente i dati sono archiviati in file di testo, quindi al giorno dell'anno 251 potresti vedere:

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.]

Mi piacerebbe aumentare il livello di astrazione, migliorare le prestazioni e ridurre la fragilità (ad esempio, il codice attuale non può inserire un giorno tra due esistenti!).Ci siamo divertiti con gli hack BLOB-y RDBMS e abbiamo persino replicato ogni riga del formato del file di testo come una riga in una tabella (una riga per coppia timestamp/latitudine, una colonna per incremento di longitudine - sì!).

Potremmo andare in un geodatabase "reale", ma il sovraccarico di etichettare ogni singolo valore con latitudine e longitudine sembra proibitivo.La dimensione e la risoluzione dei dati non sono cambiate in dieci anni ed è improbabile che cambino.

Mi sono divertito a mettere tutto nei file NetCDF, ma penso che dobbiamo superare completamente la mentalità dei file: odio che tutto il mio software debba capire i nomi dei file dalle date, gestire più file per più anni, ecc. .Anche l'alternativa, ovvero mettere tutti i dati di dieci anni (e oltre) in un unico file, non sembra praticabile.

Qualche idea o prodotto brillante?

È stato utile?

Soluzione

Ho raccolto i tuoi commenti qui:

  1. Mi piacerebbe fare tutto questo "senza scrivere il mio codice I/O del file"
  2. Ho bisogno dell'accesso da "Java Ruby MATLAB" e "routine FORTRAN"

Quando li aggiungi, sicuramente non vorrai un nuovo formato di file. Resta con quello che hai.

Se riusciamo a farti rilassare il tuo primo requisito, cioè se sei disposto a scrivere il tuo codice I/O del file, allora ci sono alcune opzioni interessanti per te.Scriverei classi C++ e utilizzerei qualcosa come SWIG per rendere le tue nuove classi disponibili nelle molteplici lingue di cui hai bisogno.(Ma non sono sicuro che potresti utilizzare SWIG per avere accesso da Java, Ruby, MATLAB e FORTRAN.Potresti aver bisogno di qualcos'altro.Io stesso non sono proprio sicuro di come farlo.)

Hai anche detto: "In realtà, se devo avere file, preferisco il testo perché così posso semplicemente entrare e modificarli manualmente quando necessario".

La mia convinzione è che questa sia un’affermazione fuorviante.Se sei disposto a creare le tue routine di I/O sui file, allora ci sono cose molto intelligenti che potresti fare...E come ultimo ripiego, potresti dotarti di uno strumento che converta dal nuovo formato di file allo stesso vecchio formato di testo a cui sei abituato...E un altro strumento che riconverte.Tornerò su questo alla fine del mio post...

Hai detto qualcosa che voglio affrontare:

"sfrutta 40 anni di ottimizzazione del DB"

I database sono pensati per dati relazionali, non per dati raster.Non sfrutterai il DB di nessuno ottimizzazioni con questo tipo di dati.Potresti essere in grado di stipare i tuoi dati in un DB, ma non è certo la stessa cosa.

Ecco la cosa più utile che posso dirti, in base a tutto quello che ci hai detto. Hai detto questo:

"Mi interessa di più ottimizzare Mio tempo rispetto a quello della CPU, anche se la velocità di esecuzione è buona!"

Francamente questo richiederà STRUMENTI.Smettila di pensarlo come un file di testo.Inizia a pensare ai compiti più comuni che svolgi e scrivi piccoli strumenti - in QUALSIASI LINGUA(E) - per rendere quelle cose FONDAMENTALI da fare.

E se i tuoi strumenti risultassero avere prestazioni scadenti?Indovina un po': è perché il tuo file di testo piatto è un formato scadente.Ma questa è solo la mia opinione.:)

Altri suggerimenti

Passerei sicuramente dal testo al binario, ma terrei comunque ogni giorno in un file separato.Potresti nominarli in modo tale che gli inserimenti intermedi non causino stranezze con gli indici, ad esempio includendo la data e l'eventuale ora nel nome del file.Potresti anche considerare la struttura del file se, ad esempio, hai più campi per posizione.È comune cercare una piccola tessera da un gran numero di passi temporali?In tal caso potresti volerli archiviare come riquadri contenenti dati di diversi giorni.Non hai menzionato il modo in cui si accede ai dati, il che gioca un ruolo importante nel modo in cui organizzarli in modo efficiente.

Chiarimenti:

Sono sorpreso che tu abbia aggiunto "database" come uno dei tag e lo abbia considerato un'opzione.Perché hai fatto questo?

In sostanza, si dispone di un'immagine 2D a virgola mobile a componente singolo in ogni passaggio temporale.Saresti d'accordo con questo modo di visualizzare i tuoi dati?

Hai menzionato anche il desiderio di inserire un giorno tra due giorni esistenti, il che mi sembra una cosa molto strana.Perché dovresti farlo?C'è un nuovo giorno tra il 4 e il 5 maggio di cui non sono a conoscenza?

La "compressione" è una delle cose che ti interessano o sei semplicemente stufo dei file flat?

Un float o un double sarebbero sufficienti per memorizzare i tuoi dati o ritieni di aver bisogno di una precisione più arbitraria?

Inoltre, con quali linguaggi di programmazione vuoi accedere a questi dati?

la tua risposta su come archiviare i dati dipende interamente da cosa farai con i dati.ad esempio, se è necessario eseguire il recupero solo specificando la data o un intervallo di date, è opportuno archiviare in un database come BLOB.ma se hai bisogno di trovare record con determinati valori, dovrai fare qualcosa di diverso.

si prega di descrivere come è necessario poter accedere ai dati/

Matt, grazie mille, e allo stesso modo Longneck e Jirv.

Questo post è stato in parte un esperimento, per testare la qualità del discorso StackOverflow.Se voi ragazzi/ragazze/forme di vita aliene siete rappresentativi, sono venduto.

E proprio sul punto, hai chiarito notevolmente il mio pensiero.Attenzione, potrei ancora non necessariamente strumento il tuo consiglio, ma sappi che lo sarò pensiero a riguardo molto seriamente.>;-)

Potrei benissimo lasciare lo stesso formato del file, aggiungere alle routine C e/o Ruby esistenti per aggiungere le poche funzionalità di basso livello che mi mancano (ad es.inserendo i passaggi temporali mancanti) e appendere un front-end HTTP sull'intera cosa in modo che i dati possano essere consumati da qualunque macchina ne abbia bisogno, in qualunque lingua sia attualmente incerta.Sebbene siano per lo più software legacy immutabili a costruire questi dati, troviamo sempre nuovi consumatori per questi, quindi il requisito multilingue/multi-computer (accidenti, l'ho dimenticato quello?) si applica al lato della lettura, non il lato della scrittura.Ciò evita anche tutta una serie di problemi di sicurezza.

Grazie ancora, gente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top