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
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.
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.
quindi dove trovi la D3 spogliata senza dipendenze dom? –
sono riuscito a calcolare le corde e gruppi di un layout corda utilizzando un lavoratore web nel modo seguente:
creare una generazione personalizzata di d3 che non ha un dependecy sull'oggetto documento o il DOM (vedi: https://github.com/mbostock/smash/wiki)
creare un file operaio web e utilizzare
importScripts
per caricare il costume d3 costruireattivare 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) -> ...
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. –
- 1. Grafici polari con D3.js
- 2. Grafici a strati in d3.js
- 3. Come utilizzare un web worker in AngularJS?
- 4. Come posso utilizzare una libreria d3 (come c3.js) sul lato server per generare grafici in nodejs?
- 5. Caricamento dati in modo asincrono in Python/Flask per d3.js
- 6. AngularJS e web worker
- 7. importScripts (web worker)
- 8. d3.js salva stati
- 9. d3.js e document.onReady
- 10. Modo corretto per importare D3.js in un'applicazione Angular 2
- 11. utilizzando d3.js come pacchetto web esterno
- 12. Combinazione di d3.js e backbone.js
- 13. Confronto tra D3.js e la libreria zingChart per visualizzazioni e grafici
- 14. D3.js - Grafici ad anello con più anelli
- 15. d3.js GeoJSON e limiti
- 16. Variabile globale in Web worker
- 17. geochart in d3.js
- 18. D3.js, necessario evento click in d3.js
- 19. Come generare grafici casuali?
- 20. ridimensionamento proiezioni d3.js
- 21. Constrained d3.js Force display
- 22. Bounding box in D3.js
- 23. Web-Worker con GWT
- 24. Come posso utilizzare Tornado e Redis in modo asincrono?
- 25. caricamento js file e altri file js dipendenti in modo asincrono
- 26. Area impilata in D3.js
- 27. Rendering in Backbone.js utilizzando d3.js e svgs
- 28. Web worker e ridimensionamento delle immagini
- 29. Data ordinamento con d3.js
- 30. soluzioni grafici per Yesod
Grazie. Avevo paura che questa sarebbe stata la risposta. – user1449496
Questa è già una vecchia domanda, ma .... Che dire di phantomJS? – meetamit
@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. –