2012-06-11 14 views
10

Attualmente sto lavorando a un problema che richiede la mia applicazione web per generare un grafico che rappresenta circa 50k a 60k di punti di dati. Si carica abbastanza velocemente (~ 6 secondi), ma quello che mi chiedo se è possibile utilizzare D3.js per generare il grafico in un Web Worker e quindi passare il SVG indietro per essere caricato nella pagina.Utilizzare Web Worker e D3.js per generare grafici in modo asincrono?

risposta

5

I Web Worker non hanno accesso al DOM, quindi tutto ciò che si potrebbe fare su quel lato sarebbe creare qualcosa che potrebbe essere utilizzato per creare rapidamente il DOM. I lavoratori possono, ad esempio, elaborare i set di dati e fare tutti i calcoli pesanti, quindi restituire il risultato come una serie di array.

+1

Grazie. Avevo paura che questa sarebbe stata la risposta. – user1449496

+0

Questa è già una vecchia domanda, ma .... Che dire di phantomJS? – meetamit

+0

@meetamit che potrebbe essere un'opzione, credo, generare il DOM sul server con phantomJS e quindi passarlo al client? ma questo non sta usando Web Workers però, che era la domanda. –

4

https://github.com/mbostock/d3/commit/43d38773623b52209d2667287a1ae626fb95b0d9

Un recente commit da Jason Davies. Mike Bostock dice che in futuro il codice dipendente dal DOM sarà separato da d3.core e in questo modo è possibile creare una build d3 personalizzata che funzioni con l'API dei web-worker.

Ho avuto lo stesso problema in cui ho un grafico di forza diretto con un numero elevato di nodi. Sembra molto pigro. Voglio migliorare le prestazioni in qualche modo. Penso che l'ultimo thread con phantomJS su un server di nodi sia una buona idea, ma la latenza della rete coinvolta nell'approccio rovinerà la sensazione di forza diretta.

+1

quindi dove trovi la D3 spogliata senza dipendenze dom? –

1

sono riuscito a calcolare le corde e gruppi di un layout corda utilizzando un lavoratore web nel modo seguente:

  1. creare una generazione personalizzata di d3 che non ha un dependecy sull'oggetto documento o il DOM (vedi: https://github.com/mbostock/smash/wiki)

  2. creare un file operaio web e utilizzare importScripts per caricare il costume d3 costruire

  3. attivare il tuo lavoratore nel codice di rendering. Ho usato una promessa per incapsulare la comunicazione con il lavoratore:

    calculateChords = (padding, matrix) -> 
         deferred = $.Deferred() 
    
         worker = new Worker("worker.js") 
    
         worker.onmessage = (e) -> 
          deferred.resolve(e.data.groups, e.data.chords); 
    
         worker.postMessage { 
          matrix: matrix 
         } 
    
         deferred.promise() 
    

    dopo, nella funzione di rendering:

    calculateChords(matrix).then (groups, chords) -> 
        ... 
    
+1

In realtà, è possibile eseguire d3 standard in un web worker se si lasciano gli oggetti (falsi) corretti che giacciono intorno a placid d3 durante l'avvio. Il problema principale però (nell'uso di d3 con i web worker) sono i sovraccarichi di serializzazione nei messaggi di invio e ricezione. Sarei molto interessato a sapere se qualcuno ha escogitato un buon metodo per usare oggetti trasferibili per ovviare comunque alla serializzazione. –