在d3中加载压缩的csv数据以进行页面优化

时间:2014-05-28 06:57:51

标签: csv d3.js dc.js

我有一个50MB的csv数据,有没有可能我可以压缩数据加载 d3.js / dc.js图表​​,现在页面太慢我想优化它..任何帮助都非常感谢

提前致谢

2 个答案:

答案 0 :(得分:6)

我认为实施延迟加载解决方案是最好的。这个想法很简单:你创建一个小的2MB CSV文件并使用它渲染你的可视化。与此同时,您开始加载完整的50MB CSV。

这是一个小片段:

DS = {} // your app holder for keeping global scope clean

d3.csv('data/small.csv', function(err, smallCSV) {

  // Start loading big file immediately
  d3.csv('data/big.csv', function(err, bigCSV) {
    DS.data = bigCSV // when big data is loaded it replaces old partial data
    DS.drawViz() // redraw viz
  })  

  // This portion of code also starts immediately, while big file is still loading
  DS.data = smallCSV
  DS.drawViz() // function which has all your d3 code and uses DS.data inside   
})

从小到大的变化可以用这样的方式完成,即用户不知道,后台发生了什么。考虑这个example,其中加载了相当大的数据文件,您可以在开始时感受到滞后。如果数据将在两轮中加载,这个应用程序可以加载得更快。

答案 1 :(得分:1)

那是很多数据;给我们一些前几行的样本。你在做什么,它有多少会影响屏幕上的内容? csv来自哪里(即本地或网络服务)?

如果是下载资源的问题,取决于值的常见程度和大小,您可以将它们重构为预先加载定义的1字节密钥(哈希映射为O(1)访问)。此外,如果你使用大量的数字数据,也许不同的数字空间(即使用比基数10少的字符的东西)可以削减最终大小的一些字节,因为CSV值是字符串。

听起来,CSV可能不是一种可行的方式,特别是如果您的CSV主要是唯一字符串或某些数字数据不能从上述优化中获益。如果您从Web服务加载CSV,则可以对其进行更改,以便通过某个传递的密钥返回某些块(或者更智能地处理服务器端)。因此,您只需在任何给定时间加载您需要的内容,并可能将其缓存。

最后,您可以安排多个异步调用,以小块的形式加载整个内容,类似于leakyMirror建议的内容。由于使用大量块可能最有意义,因此您希望使用代码(而不是键入所有这些回调),并使用异步事件调度程序。我知道有一个流行的异步库(https://github.com/caolan/async)有很多方法可以做到这一点,或者你可以编写自己的回调调度程序。