减少大数据集 DOM 元素的策略

2024-01-05

我有一个大型数据集,想使用 dc.js 显示。条目数量远远超出了屏幕上可用的绘图空间(以像素为单位)。因此,在 500 像素宽的图表上渲染 20k 点是没有意义的,而且还会降低浏览器的速度。

我读了维基百科的性能柚木部分 https://github.com/dc-js/dc.js/wiki/Optimization-and-Performance-Tuning并想到了其他一些事情:

  • 使用交叉过滤器聚合组(例如,如果我有 500 像素宽的 svg,则将数据集分为 500 组)
  • 使用 Douglas–Peucker 或 Visvalingam 算法简化我的数据

dc.js 提供了一个简洁的rangeChart https://dc-js.github.io/dc.js/docs/html/dc.coordinateGridMixin.html#rangeChart可用于显示我想要使用的范围选择。

但我放大得越多rangeChart我想展示的细节越多。但我不知道如何获取图表的缩放级别并“即时”聚合一组。也许有人对此有过思考。

我创建了一个codepan https://codepen.io/anon/pen/NEZNYe举个例子。


这个问题出现了很多,所以我添加了一个焦点动态间隔 http://dc-js.github.io/dc.js/examples/focus-dynamic-interval.html例子。

这是对相同技术的改进切换时间间隔 http://dc-js.github.io/dc.js/examples/switching-time-intervals.html例如,除了这里我们确定哪个d3时间间隔 https://github.com/d3/d3-time#api-reference根据范围图表中画笔的范围来使用。

不幸的是我现在没有时间调整它,所以让我们迭代一下。 IMO 它几乎但不够快 - 它可以采样更少的点,但我使用了内置的时间间隔。当您在直流折线图中看到锯齿线时

这通常是因为你正在显示too many点 - 应该有几十个,而不是几百个,更不能有几千个。

这个想法是在不同的时间间隔产生不同的组。在这里,我们将定义一些间隔和阈值(以毫秒为单位),在该阈值时我们应该使用该间隔:

    var groups_by_min_interval = [
        {
            name: 'minutes',
            threshold: 60*60*1000,
            interval: d3.timeMinute
        }, {
            name: 'seconds',
            threshold: 60*1000,
            interval: d3.timeSecond
        }, {
            name: 'milliseconds',
            threshold: 0,
            interval: d3.timeMillisecond
        }
    ];

同样,这里应该有更多 - 因为我们将动态生成组并缓存它们,所以有一堆是可以的。 (它可能会在某些时候占用内存,但现在在 JS 中千兆字节已经可以了。)

当我们需要一个组时,我们将使用 d3 间隔函数生成它,该函数生成下限,然后减少总计和计数:

    function make_group(interval) {
        return dimension.group(interval).reduce(
            function(p, v) {
                p.count++;
                p.total += v.value;
                return p;
            },
            function(p, v) {
                p.count--;
                p.total += v.value;
                return p;
            },
            function() {
                return {count: 0, total: 0};
            }
        );
    }

因此,我们将告诉图表计算其平均值valueAccessors:

    chart.valueAccessor(kv => kv.value.total / kv.value.count)

这是有趣的部分:当我们需要一个组时,我们将扫描这个列表,直到找到第一个阈值小于当前范围(以毫秒为单位)的规范:

    function choose_group(extent) {
        var d = extent[1].getTime() - extent[0].getTime();
        var found = groups_by_min_interval.find(mg => mg.threshold < d);
        console.log('interval ' + d + ' is more than ' + found.threshold + ' ms; choosing ' + found.name +
                    ' for ' + found.interval.range(extent[0], extent[1]).length + ' points');
        if(!found.group)
            found.group = make_group(found.interval);
        return found.group;
    }

将其连接到filtered范围图的事件:

    rangeChart.on('filtered.dynamic-interval', function(_, filter) {
        chart.group(choose_group(filter || fullDomain));
    });

暂时没时间了。请提出任何问题,我们会更好地完善它。我们需要自定义时间间隔(例如十分之一秒),但我现在找不到该示例。有一个好方法可以做到这一点。

Note:我比你高了一个数量级,积分达到了五十万。这对于较旧的计算机来说可能太多了,但在 2017 年的计算机上,它证明数据量不是问题,DOM 元素才是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

减少大数据集 DOM 元素的策略 的相关文章

随机推荐

  • NLog 上的配置转换不起作用

    我有一个 Web 项目 ASP NET MVC 4 项目 其中存储了许多配置网页配置 and in NLog config files 我有几个发布配置文件发布配置文件1 发布配置文件2当使用发布配置文件将我的 Web 项目部署到服务器时
  • IIS Express applicationhost.config - 身份验证错误

    我在 Windows 10 下运行 IIS Express 不要与普通 IIS 混淆 我的理解是设置存储在 My Documents IISExpress config applicationhost config 中 当使用创建 ASP
  • ScrollView .scrollTo 不起作用?保存 ScrollView 旋转位置

    好吧 我必须在这里忽略一些非常简单的事情 但我认为我正在尝试做一些相当基本的事情 只需保留 ScrollView 在方向变化时的滚动条位置 这是我的 onSaveInstanceState 和 onRestoreInstanceState
  • 可捕获的致命错误:参数 1 传递给 ?交响乐2

    我对以下错误消息感到困惑和沮丧 可捕获的致命错误 参数 1 传递到 Medicine UserBundle Entity User setUsertype 必须是 Medicine UserBundle Entity Usertype 的实
  • 保证金不会压低另一个保证金

    我有一系列这样的元素 h1 h1 p p h1 h1 p p 我的上边距为 5pxh1 以及 10px 的下边距p 但最终的边距只有 10px 如果我将底部边距增加到 50px 将顶部边距增加到 40px 则总边距只有 50px 总利润始终
  • 如何引用不同方法的参数?

    是否可以从与您正在为其编写摘要的方法不同的方法引用参数 如果可以 语法是什么 我知道关于
  • 如何在 iPhone 上使用 xmlparsing 解析 XML 文件?

    如何在 iPhone 上使用 xmlparsing 访问以下 XML 文件
  • 如何使用leaks命令行工具查找内存泄漏?

    leaks命令行工具将报告 泄漏内存的地址 泄漏的大小 以字节为单位 泄漏缓冲区的内容 像下面这样 Process checker 84357 Path path to program Load Address 0x104703000 Id
  • 无法安装 MySQL-Python

    我想为我的代码尝试 sqlalchemy 但为了使用它 我需要首先安装 mysql python 我下载了该软件包 但是当我尝试 python setup py install 时 它给了我一个我无法理解的错误 running build
  • 从 xaml 中的样式设置器属性获取值

    如何获取 xaml 中样式设置器属性的值 例如 我有下一个样式 如何从 TextBox 默认样式中获取背景属性的值 我需要这个因为我无法访问TextBox style 如果您无法修改 TextBox 样式 您可以执行此解决方法 经过测试 有
  • 不带 ssl 的 npm 安装

    我的 Ubuntu 虚拟机在连接到使用 ssl 即 https 的站点时遇到问题 如果 url 以 http 开头 则可以成功从 Internet 下载工件 npm install 将通过 https 下载依赖项 有没有办法通过http下载
  • LockModeType Jpa 之间的区别

    我对 JPA 中 LockModeTypes 的工作感到困惑 LockModeType Optimistic 它在提交时增加版本 这里的问题是 如果我的实体中有版本列 并且如果我没有指定此锁定模式 那么它的工作原理也类似 那么它有什么用 L
  • 无法使用 ConfigurationManager.AppSettings 读取 Web.config

    我已经构建了一个 WCF 服务 它使用 Web config 来获取一些 appSettings 在 Visual Studio 中它工作得很好 但是当我发布和安装该服务时 它突然从 App config 而不是从 Web config 获
  • 如何将 13 位 Unix 时间戳转换为日期和时间?

    我有这个 13 位时间戳 1443852054000 我想将其转换为日期和时间 但没有成功 我试过这个代码 echo date Y m d h i s item gt timestamp 对我不起作用 而且这个 unix time date
  • PHPUnit 仅从命令行运行。为什么?

    我有以下代码 当我在浏览器中打开 PHP 文件时 出现以下错误 致命错误 找不到类 PHPUnit Framework TestCase 但是 如果我使用命令行 它工作正常 phpunit 本地路径 testcase php Result
  • 拥有大量数据库时遇到问题?

    我们构建了一个托管 Web 应用程序 该应用程序的开发方式是将每个客户连接到单独的数据库 该应用程序是一个网络平台 发布系统 到目前为止 该设计一直运行良好 我们还有一个主数据库 现在我们即将对定价模式进行一些更改 这将引入免费帐户 这应该
  • 如何在VS2010中创建新的项目类型?

    我已经弄清楚如何创建一个新的template 但我需要比这多一点的力量 例如 我需要覆盖当您单击 运行 按钮时发生的情况 我希望它启动开发服务器 然后弹出打开我的网络浏览器 那么 如何添加全新的项目类型呢 更好的是 我如何才能将其基于其他项
  • WordPress has_comments 不起作用

    我在 WordPress 中设置了 comment 条件 这个条件是在 comments php 中设置的 就像 wordpress 默认主题一样 然后使用comment template加载整个comments php文件 现在 当我删除
  • 如何设置UnderlineSpan的颜色?

    这个问题是我上一个问题的后续问题 如何像 Android 拼写检查器一样突出显示文本 https stackoverflow com questions 14530546 how to highlight text like android
  • 减少大数据集 DOM 元素的策略

    我有一个大型数据集 想使用 dc js 显示 条目数量远远超出了屏幕上可用的绘图空间 以像素为单位 因此 在 500 像素宽的图表上渲染 20k 点是没有意义的 而且还会降低浏览器的速度 我读了维基百科的性能柚木部分 https githu