2015-06-22 16 views
8

Sto usando Atom/Electron per creare un'app che ha visualizzazioni su video in base ai dati. Ogni video ha un file CSV corrispondente con informazioni per ogni frame. I video sono circa 100 minuti, quindi i file hanno un sacco di dati!Il modo migliore per leggere da un grande file CSV senza caricare tutto in memoria utilizzando Javascript

Il problema che sto avendo è che ci vogliono un paio di secondi per caricare e analizzare il file. Il più delle volte questo non è un problema. Ma ho bisogno di creare playlist di parti di video e caricare l'intero file CSV ogni volta che un video viene modificato non è un'opzione praticabile.

Ho cercato di archiviare le opzioni di streaming come fast-csv, ma non sono riuscito a iniziare a leggere per una parte arbitraria del file.

MODIFICA: dalla documentazione di FS. In questo caso la domanda è: come posso sapere quale byte corrisponde alla posizione che voglio nel file?

le opzioni possono includere valori di inizio e fine per leggere un intervallo di byte dal file anziché dall'intero file. Sia inizio e la fine sono inclusiva e partono da 0.

Cosa pensi sarebbe il metodo migliore e più performante a questa situazione?

In concreto:

C'è un modo di partenza per leggere un flusso da qualsiasi parte di un file CSV?

Considerate che esiste un altro metodo di archiviazione che mi consentirebbe di risolvere meglio questo problema?

+1

Le larghezze di colonna sono state corrette in csv? (ad esempio, la colonna 1 è sempre di 20 caratteri) –

+0

Questa domanda potrebbe essere utile: http://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js Non so abbastanza sul nodo per rispondere con certezza, ma mi sembra che tu voglia mandare on line il csv alla volta. –

+0

@DevinH. no, ma ogni colonna è sempre un numero, quindi non sarebbe difficile usare una sorta di padding. Idealmente preferirei non farlo. Stavo pensando di indicizzare la posizione dei byte di ogni riga. E memorizzare un array con le posizioni. Non sarebbe un problema fare qualche elaborazione quando il file viene caricato per la prima volta. – limoragni

risposta

1

Per il mio commento, Sqlite sembra essere quello che cercate. Potrebbe non essere la soluzione definitiva a lungo termine, ma funzionerà sicuramente per il momento, mentre decidi se desideri seguirlo o codificare la tua soluzione.

funzionamento interno di Sqlite

SQLite è ottimizzato per il nucleo, ma ha tre caratteristiche principali che causano l'esecuzione di più veloce del normale disco si legge, in particolare i file CSV:

  1. l'intero database (ogni database creato) è memorizzato in 1 singolo file, non più file o record.
  2. Questo file è impaginato in blocchi da 1024 byte (1K) che consentono di saltare facilmente intorno ai dati.
  3. (Parte reale di 2) L'intero database e il sistema di paging è un enorme albero binario che di solito richiede meno di 10 salti per trovare dati specifici.Quindi in parole povere, estremamente veloce!

Se si è veramente interessati a comprendere l'ambito completo di tutto ciò, non ho trovato una spiegazione migliore di this amazing blog post by Julia Evans.

Inconvenienti Possibili

Oltre il funzionamento interno, SQLite è progettato per essere lato client lavoro sulla macchina degli utenti. Se questa non è una soluzione praticabile, ci sono soluzioni alternative che possono essere fatte. Ad esempio, Sqlite può essere utilizzato come server Web ma prospera in modo ottimale in un'installazione indipendente o mista. Ricorda anche che ogni computer client è diverso. Un computer può elaborare i record più rapidamente del successivo, ma in generale non è necessario preoccuparsi poiché i computer lato client di solito sono poco carichi.

  • Standalone richiederebbe tutto sul lato client. Questo è in genere il modo in cui viene utilizzata Sqlite. L'ho usato per i giochi in passato, utilizzando l'API sqlite4java's per connettersi al database con Java; l'API ha reso l'intera esperienza come PHP e MySQL su un server. Potrebbe essere necessario trovare altre API poiché Sqlite è scritto in C.
  • L'instillazione mista viene eseguita allo stesso modo di quella autonoma ma si codifica nel programma un collegamento a un server effettivo. Per i giochi che ho contribuito a fare, tenevamo traccia di cose come punteggi e dati dell'utente, e periodicamente in background passiamo questo ad un server reale se potessimo ottenere una connessione. Questo funziona anche al contrario. È possibile avviare l'utente con nient'altro, ma alla prima esecuzione può scaricare tutto ciò che è necessario e da allora rimanere aggiornato con ciò che è presente sul server.

Sommario

Sqlite lavorerà per quello che ti serve, ma può richiedere un po 'di compiti a casa per l'installazione in modo che vi serve. Sqlite4java ad esempio è facile da installare ma confonde da imparare poiché la loro documentazione è così scarsa; Stack Overflow mi ha aiutato a superarlo. Sqlite è anche un uso e dimentica il tipo di installazione in modo da rispondere alla tua domanda, gestirà 25 righe al secondo come una torta, non dovrai preoccuparti di ottimizzare solo il tuo codice.

2

Consiglio vivamente Papaparse per questo. Permette lo streaming di un CSV 'riga per riga', che può essere elaborato in formato JSON basato su intestazioni nel file.

All'interno di un oggetto config passato alla funzione di analisi, è possibile fornire un parametro "step", che è una funzione da eseguire per ogni riga del file durante il passaggio.

Nota: Può anche essere configurato per utilizzare un lavoratore-thread per aumentare le prestazioni durante la manipolazione di grandi dimensioni del CSV

http://papaparse.com/docs

+0

Ok, sembra bello, ma penso che non sia diverso da qualcosa come fast-csv o csv-parser. Non mi dà modo di avviare lo streaming da una riga arbitraria di csv. Se devo avviare lo streaming sempre dall'inizio, la soluzione non si adatta al mio caso. Sai se esiste un modo per saltare a una determinata riga? – limoragni

+0

Se, ad esempio, si richiedevano informazioni che risiedevano nella riga 500 del file, la funzione "passo" si limitava a rilevare ciò e non eseguiva alcuna elaborazione per le altre righe. Tecnicamente, per iniziare lo streaming da un punto particolare del file, l'inizio del file doveva ancora essere caricato in una certa misura per sapere che hai raggiunto il punto richiesto. Se nessuna elaborazione avviene su un particolare "passo", si muove attraverso il file incredibilmente velocemente - quindi non sarei preoccupato dei problemi di prestazioni qui. – locksem

+0

Ho avuto errori con fast-csv per analizzare un grande csv in nodejs, senza errori in questa libreria (con lo stesso file csv) https://github.com/wdavidw/node-csv – steampowered