2012-05-07 1 views
14

I requisiti del progetto sono strano per questo, ma sto cercando di ottenere una certa comprensione ...Elaborazione di un grande (12K + file) array in JavaScript

ho creato un file CSV con circa 12.000 righe di dati, circa 12-15 colonne. Lo sto convertendo in un array JSON e lo sto caricando tramite JSONP (deve essere eseguito sul lato client). Sono necessari molti secondi per eseguire qualsiasi tipo di query sul set di dati per restituire un set di dati più piccolo e filtrato. Attualmente sto usando JLINQ per fare il filtraggio, ma essenzialmente sto semplicemente collegando l'array e restituendo un set più piccolo in base alle condizioni.

Webdb o IndexEdb mi consente di eseguire questo filtro in modo significativamente più veloce? Qualche tutorial/articoli là fuori che tu sappia che affronta questo particolare tipo di problema?

+0

Per offrirti qualche utile specifica, dovremmo vedere in quale formato JSON sono presenti i dati e quali query/filtri stai tentando di eseguire. La corrispondenza tra il formato dei dati (o gli indici) e l'operazione di filtro/query desiderata è ciò che ti dà velocità. – jfriend00

+0

Non sono familer con webdb, ma sql lato client potrebbe essere d'aiuto. Alla fine, però, sei in balia del motore del browser. –

risposta

11

http://square.github.com/crossfilter/

Crossfilter è un Libreria JavaScript per l'esplorazione di serie di dati multivariate grandi nel browser. Crossfilter supporta estremamente veloci (< 30ms) interazione con vista coordinati, anche con set di dati contenente un milione o più record ...

+1

Questa è una libreria incredibile che ho appena trovato, e quindi chiaramente la risposta giusta per il problema dell'OP. –

3

Questo mi ricorda un articolo scritto da John Resig sulle ricerche nel dizionario (un vero dizionario, non un costrutto di programmazione).

http://ejohn.org/blog/dictionary-lookups-in-javascript/

Si inizia con le implementazioni lato server, e quindi lavora su una soluzione lato client. Esso dovrebbe darvi alcune idee di modi per migliorare ciò che si sta facendo in questo momento:

  • Caching
  • bagagli locale
  • Considerazioni memoria
+0

Non proprio mele-a-mele, ma spero che ti dia qualche idea. –

3

Se avete bisogno di caricare un intero oggetto di dati in memoria prima di applicare un po 'di trasformazione su esso , Lascerei IndexedDB e WebSQL fuori dal mix poiché in genere aumentano la complessità e riducono le prestazioni delle app.

Per questo tipo di filtraggio, una libreria come Crossfilter andrà molto lontano.

Dove IndexedDB e WebSQL possono entrare in gioco in termini di filtraggio è quando non è necessario caricare, o non si desidera caricare, un intero set di dati in memoria. Questi database sono utilizzati al meglio per la loro capacità di indicizzare righe (WebSQL) e attributi (IndexedDB).

Con nei database del browser, è possibile eseguire lo streaming di dati in un database un record alla volta e quindi scorrere attraverso di esso, un record alla volta. Il vantaggio qui per il filtraggio è che questo significa che puoi lasciare i tuoi dati su "disco" (uno .leveldb in Chrome e il database .sqlite per FF) e filtrare i record non necessari come pre-filtro o filtro in sé.