【问题标题】:speeding up google charts rendering or alternatives加快谷歌图表渲染或替代方案
【发布时间】:2015-01-30 03:31:25
【问题描述】:

所以我需要显示大约 30,000 个数据点的基本图表,我目前正在使用 Google Charts,并在 javascript 中使用以下代码,其中包含一些 jinja:

    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
        google.load('visualization', '1.1', {packages: ['line']});
        google.setOnLoadCallback(drawChart);

        function drawChart() {

          var data = new google.visualization.DataTable();
          data.addColumn('number', 'Time');
          data.addColumn('number', "value1");
          data.addColumn('number', "value2");
          var mnemonic_count = 1;
          {% for item in response %}
            data.addRow([mnemonic_count, {{item["value1"] | safe}}, {{item["value2"] | safe}}]);
            count = count+1;
          {% endfor %}

          console.log(count);

          var options = {
            chart: {
              title: 'value over time',
              subtitle: 'count . ' data points'
            },
            width: 900,
            height: 500
          };

          var chart = new google.charts.Line(document.getElementById('linechart_material'));
          chart.draw(data, options);
        }
    </script>

<html>
    <div id="linechart_material"></div>
</html>

这适用于小型数据集,它永远不会真正失败,但是当我获得所需的数据点数量时,大约 30,000 个,加载需要将近 30 秒。我可以在后端做些什么来加快速度,或者有谁知道基于浏览器的图表是否可以更快地呈现?

【问题讨论】:

    标签: javascript optimization google-visualization


    【解决方案1】:

    不幸的是,一些图表库并不是为处理大数据集而构建的。如果您自己的优化没有成功,那么切换到另一个库可能是最好的解决方案。

    更多重量级选项包括Highcharts、ZingChart,以及 - 如果您准备好迎接陡峭的学习曲线 - d3.js。

    我是 ZingChart 团队的一员,我们使用一些常用库构建了 render speed demo。它可能会帮助您了解使用不同数据集的正常渲染时间。请记住,交互式功能和图表元素的数量/类型(除了数据点)也会影响速度。请注意,库/渲染测试的某些组合可能会杀死页面或锁定您的浏览器一段时间。我们允许这样做是为了展示真实的行为。

    如果您对主题或 ZingChart 有任何疑问,请随时与我们联系。

    【讨论】:

    • 哇,这是一个令人印象深刻的差异。使用 ZingChart 渲染大约需要 2 秒,加载替代在用户界面方面有很大的不同。即使我用多行将它增加到 100,000 个数据点,它也不到 3 秒。谢谢你的好建议!
    • 您是否有机会向我指出为什么这项服务似乎也是一个更重的功能集,但它的速度却如此之快?
    • 不客气!这一切都取决于底层库的实现以及对您提供的数据的敏感程度。例如,让我们以我从谷歌图表文档中提取的关于如何创建折线图的示例为例。 developers.google.com/chart/interactive/docs/gallery/linechart plnkr.co/edit/wqH4SM68dcLXzr6jnfzm?p=preview 现在如果您检查 dom,您会看到它存储了一份其数据的副本存储在 中!这最终会导致 dom 爆炸,特别是如果你需要 30,000 点。
    • 快速性能的关键是内存管理,并确保最终结果不会过度利用脆弱的 DOM。另一个影响速度的重要因素是库如何处理所提供数据的可视化。同样,我将专注于谷歌图表。 plnkr.co/edit/50kKUUg8xtl9m4PcX6BW?p=preview
    • @guruz,感谢您的提醒!我不再是 ZC 团队的成员,但我已经联系了几个仍然在职的开发人员 - 他们应该能够帮助你。
    【解决方案2】:

    您可以通过使用arrayToDataTable() 获得更快的响应,为它提供一个您只需将行推送到其上即可构造的单个数组,而不是通过 30000 个 datatable.addRow() 调用一次添加一行。

    【讨论】:

    • 嗯,好主意!但它只加快了 10% 左右,所以从 30 秒到 27 秒
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多