2012-06-11 20 views
10

Actualmente estoy trabajando en un problema que requiere que mi aplicación web genere un gráfico que represente aproximadamente 50k a 60k puntos de datos. Se carga bastante rápido (~ 6 segundos), pero lo que me pregunto es si es posible usar D3.js para generar el gráfico en un Trabajador web y luego pasar el SVG para que se cargue en la página.¿Utiliza Web Worker y D3.js para generar gráficos de forma asíncrona?

Respuesta

5

Web Los trabajadores no tienen acceso a DOM, por lo que todo lo que podrías hacer en ese lado sería construir algo que pueda usarse para crear rápidamente el DOM. Los trabajadores podrían, por ejemplo, procesar los conjuntos de datos y hacer todos los cálculos pesados, luego pasar el resultado nuevamente como un conjunto de matrices.

+1

Gracias. Temía que esta fuera la respuesta. – user1449496

+0

Esta es una vieja pregunta, pero ... ¿Qué pasa con phantomJS? – meetamit

+0

@meetamit que podría ser una opción, supongo, generar el DOM en el servidor con phantomJS y luego pasarlo al cliente? pero eso no está usando Web Workers, que era la pregunta. –

4

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

Un reciente cometen por Jason Davies. Mike Bostock dice que en el futuro el código dependiente de DOM estará separado de d3.core y de esa manera usted puede crear una compilación d3 personalizada que funcione con la API de web-workers.

Tuve el mismo problema cuando tengo un gráfico de fuerza dirigida con una gran cantidad de nodos. Se siente muy lento. Quiero mejorar el rendimiento de alguna manera. Creo que el último hilo con phantomJS en un servidor de nodos es una buena idea, pero la latencia de la red implicada en el enfoque arruinará la sensación suave dirigida a la fuerza.

+1

Entonces, ¿dónde se encuentra el D3 eliminado sin dependencias dom? –

1

me las arreglé para calcular los acordes y grupos de un diseño acorde usando un trabajador web de la siguiente manera:

  1. crear una versión personalizada de d3 que no tiene un dependecy en el objeto o documento el DOM (ver: https://github.com/mbostock/smash/wiki)

  2. crear un archivo de trabajador web y utilizar importScripts para cargar la costumbre d3 construir

  3. activar su trabajador en su código de representación. He utilizado una promesa para encapsular la comunicación con el trabajador:

    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() 
    

    más tarde, en la función de representación:

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

En realidad, puede ejecutar d3 estándar en un trabajador web si deja los objetos correctos (falsos) a su alrededor para aplacar d3 cuando se inicia. Sin embargo, el principal problema (al usar d3 con los trabajadores de la web) es la serialización de los gastos generales en los mensajes de envío y recepción. Sin embargo, estaría muy interesado en saber si alguien ha ideado un buen método para usar objetos transferibles para obviar la serialización. –