Reputation: 196
I'm currently working a problem that requires my web application to generate a chart that represents approximately 50k to 60k points of data. It loads fairly quickly (~6 seconds), but what I'm wondering if it is possible to use D3.js to generate the graph in a Web Worker and then pass the SVG back to be loaded into the page.
Upvotes: 12
Views: 5766
Reputation: 5911
https://github.com/mbostock/d3/commit/43d38773623b52209d2667287a1ae626fb95b0d9
A recent commit by Jason Davies. Mike Bostock says that in future the DOM dependent code will be separated from d3.core and that way you can make a custom d3 build that works with web-workers API.
I had the same problem where I have a force directed graph with a large number of nodes. It feels very sluggish. I want to improve the performance in some way. I think the last thread with phantomJS on a node server is a good idea, but the network latency involved in the approach will ruin the smooth force-directed feeling.
Upvotes: 5
Reputation: 9812
I managed to calculate the chords and groups of a chord layout using a web worker by doing the following:
create a custom build of d3 that doesn't have a dependecy on the document object or the DOM (see: https://github.com/mbostock/smash/wiki)
create a web worker file and use importScripts
to load the custom d3 build
activate your worker in your rendering code. I used a promise to encapsulate the communication with the worker:
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()
later, in the rendering function:
calculateChords(matrix).then (groups, chords) ->
...
Upvotes: 1
Reputation: 60966
Web Workers have no DOM access, so all you could do on that side would be to build something that could be used for quickly creating the DOM. The worker(s) could e.g process the datasets and do all the heavy computations, then pass the result back as a set of arrays.
Upvotes: 5