Formato di archiviazione veloce per enormi nuvole di punti (lettura / scrittura veloce)

0

Sto lavorando con enormi nuvole di punti (1 miliardo di punti). Ho bisogno di elaborarli e visualizzarli, ma a causa della dimensione dei dati, non posso avere tutto in memoria allo stesso tempo.

Prima di tutto, non sto chiedendo un tecnico che lo faccia (CloudCompare, Potree, Terrasolid, ecc.). Sto chiedendo una soluzione di formato file per questo problema di archiviazione.

Ho intenzione di archiviare le nuvole di punti in un ottetto con versioni multi-risoluzione della nuvola di punti. Ogni nodo contiene una "sezione" delle nuvole di punti ad una data risoluzione. Ogni nodo dovrebbe essere in grado di contenere più nuvole di punti (preferibilmente separate in modo da poterne caricare una senza dover caricare le altre). Ogni nuvola di punti è composta da punti che possono avere attributi (almeno x, y, z, t, g, b, ma in futuro ne aggiungerò alcuni, quindi deve essere abbastanza flessibile da permetterlo).

Visualizzerò le nuvole di punti, quindi ho bisogno di un accesso molto veloce al nodo (come in, non voglio analizzare 10 GB di file prima di trovare il nodo che ho richiesto). E lavorerò e modificherò i dati, quindi ho bisogno di crescere i nodi, modificare i dati. Anche nel "centro" del file, il che significa che deve supportare un tipo di paging / chunking dei dati per consentire inserimenti veloci.

Il formato del file non è pensato per essere condivisibile tra computer. Funzionerà come una cache mentre il programma è in esecuzione e le performance in lettura e amp; l'accesso in scrittura è il più importante.

In questo momento ho trovato alcune "soluzioni":

  • completamente personalizzato formato di file: Prendo la concezione e amp; tempo di sviluppo, potrei reinventare la ruota ma farà ciò che voglio
  • struttura di directory : utilizzo il file system per fare il lavoro per me. Definisco la struttura ad otto utilizzando le directory e memorizzo ciascuna delle mie nuvole di punti come un file nelle directory. Poiché ogni nodo è un piccolo sottoinsieme della nuvola di punti originale (forse 10k punti), le scritture non impiegheranno molto tempo, ma per caricare un nodo, ho bisogno di leggere tutti i file nella directory che non è efficiente. Se unisco tutte le nuvole di punti in un singolo file in ogni nodo, non è efficiente scrivere su di esso se voglio modificare una nuvola di punti singola
  • Formato basato su HDF5 : sembra promettente, posso archiviare tutto il mio otto in un unico file, la libreria mi gestisce tutti gli chunking, l'accesso veloce e la gestione dei dati, ma ho sentito alcuni cose brutte su di esso (solo un'implementazione che è difficile da capire, specifiche complicate). Potrebbe essere eccessivo per i miei bisogni.
  • database : qualcosa come il modulo pgPointCloud per PostgreSGL.

I software di cui ho parlato prima sono:

  • potree : utilizza una rappresentazione di directory dell'otto, quindi memorizza ciascun nodo in un file LAS o LAZ. I file LAS / LAZ sono utili per archiviare i dati ma non per lavorarci su (elaborazione e modifica).
  • Terrasolid : utilizza i file FBI (Fast Binary Format). Ho difficoltà a trovare informazioni su questo formato di file, ma il suo nome sembra promettente. Non penso sia aperto, ma se hai risorse in questo formato, sarebbe fantastico.

Preferirei restare con la struttura ad otto (che ha molti vantaggi per me), ma se un formato già esistente per la memorizzazione di dati ordinati spazialmente fa quello che mi serve, sentitevi liberi di menzionarlo!

Al momento mi sto orientando verso la soluzione HDF5, ma prima di provare a eseguire test reali, mi piacerebbe avere la tua opinione sulla domanda. Ho perso alcune soluzioni? Alcune soluzioni sono inefficienti per le mie esigenze (come forse la soluzione del database?). Hai qualche esperienza in materia che potrebbe aiutarmi?

Grazie in anticipo!

(Ho postato qui, ma forse c'è un forum stackexchange più appropriato dedicato allo storage? Mi spiace se ho postato nel posto sbagliato).

    
posta Ebatsin 13.03.2018 - 11:09
fonte

1 risposta

1

Non sono un esperto del settore, né conosco i tuoi precisi vincoli / dati, ma posso avere un'idea. O almeno qualcosa che varrebbe la pena provare se i punti sono distribuiti in modo più o meno uniforme .

Invece di un otto, esiste un concetto più semplice chiamato "hashing spaziale". Fondamentalmente, usando il tuo x,y,z , calcoli un'approssimazione della sua posizione arrotondandola e usandola come hash.

Fondamentalmente, invece di un albero di recusrsive hai un'enorme mappa di hash piena di punti. Devi solo scegliere un arrotondamento delle coordinate che si adatta bene. Questa tecnica tuttavia non è appropriata se la distribuzione dei punti è molto distorta.

Le mappe persistenti sono più facili da trovare rispetto alle implementazioni di otto. (Autopromozione spudorata: se usi Python puoi provare il mio se vuoi dare un colpo veloce, dovrebbe essere abbastanza efficiente link ). Naturalmente, se le prestazioni sono fondamentali, un'implementazione su misura sarebbe la più veloce.

Inoltre, sconsiglio di usare il filesystem per costruire enormi ocre, ucciderà le prestazioni. Alcuni DB, d'altro canto, hanno il supporto per gli indici spaziali, che sarebbe probabilmente anche una buona opzione.

    
risposta data 13.03.2018 - 18:37
fonte

Leggi altre domande sui tag