大规模时空数据可视分析

国家某大型 973 科研课题的划水日常

阿里@黯晓 @hijiangtao

2017.7

导师画了张大饼

就走了

剩下我一人凌乱

我该如何顺利毕业

要做的事情都有

  • 海量时空数据背景下的特征提取工程
    • 经费紧张的情况下如何吃下海量的数据啊
    • Reviewer 都喜欢听什么故事啊
    • 只有一堆经纬度点让我怎么胡诌瞎侃啊
  • 基于 WEB 可视交互系统实现
    • 导师各种奇怪需求功能切完别写死啊
    • 这么多点要能画出来啊
    • 还要画的好看啊
    • 别一初始化就卡死还要能够交互啊

特征提取

分类/聚类

可视化

画什么

用什么工具
怎么上色

画什么

挑一个画板 (Map)

挑一个画笔 (Interface)

SVG

  • 不依赖分辨率
  • 支持事件处理器
  • 最适合带有大型渲染区域的应用程序
  • 复杂度高会减慢渲染速度(DOM)
  • 不适合游戏应用

Canvas (2D/3D)

  • 依赖分辨率
  • 不支持事件处理器
  • 弱的文本渲染能力
  • 能够以 .png 或 .jpg 格式保存结果图像
  • 最适合图像密集型的游戏,其中的许多对象会被频繁重绘

MapD

Open Source GPU Database and Visualization Platform for Real-Time Analytics.

* https://www.mapd.com/

怎么上色(计算)?

A tool for making JavaScript code run faster.

Hello World

// input

(function () {
  function hello() { return 'hello'; }
  function world() { return 'world'; }
  global.s = hello() + ' ' + world();
})();
// output

(function () {
  s = "hello world";
})();

Elimination of abstraction tax

// input

(function () {
  var self = this;
  ['A', 'B', 42].forEach(function(x) {
    var name = '_' 
        + x.toString()[0].toLowerCase();
    var y = parseInt(x);
    self[name] = y ? y : x;
  });
})();
// output

(function () {
  _a = "A";
  _b = "B";
  _4 = 42;
})();

Fibonacci

// input

(function () {
  function fibonacci(x) {
    return x <= 1 ? 
      x : fibonacci(x - 1) + fibonacci(x - 2);
  }
  global.x = fibonacci(23);
})();
// output

(function () {
  x = 28657;
})();

Module Initialization

// input

(function () {
  let moduleTable = {};
  function define(id, f) { moduleTable[id] = f; }
  function require(id) {
    let x = moduleTable[id];
    return x instanceof Function ? 
        (moduleTable[id] = x()) : x;
  }
  global.require = require;
  define("one", function() { return 1; });
  define("two", function() { 
    return require("one") + require("one"); 
  });
  define("three", function() { 
    return require("two") + require("one"); 
  });
  define("four", function() { 
    return require("three") + require("one"); 
  });
})();
three = require("three");
// output

(function () {
  function _2() {
    return 3 + 1;
  }

  var _1 = {
    one: 1,
    two: 2,
    three: 3,
    four: _2
  };

  function _0(id) {
    let x = _1[id];
    return x instanceof Function ? 
        _1[id] = x() : x;
  }

  require = _0;
  three = 3;
})();

Environment Interactions and Branching

// input

(function(){
  function fib(x) { 
    return x <= 1 ? 
      x : fib(x - 1) + fib(x - 2); 
  }
  let x = Date.now();
  if (x === 0) x = fib(10);
  global.result = x;
})();
// output

(function () {
  var _0 = Date.now();
  if (typeof _0 !== "number") {
    throw new Error(
        "Prepack model invariant violation"
    );
  }
  result = _0 === 0 ? 55 : _0;
})();

How does it work?

  • Abstract Syntax Tree(AST)
  • Concrete Execution
  • Symbolic Execution
  • Abstract Interpretation
  • Heap Serialization

试一试

总结

  • 让人易读易维护的工程代码
  • 让解释器执行更快的 JavaScript 代码优化
  • 让渲染引擎绘制更快的策略考虑
  • 让浏览器下岗的策略
  • JavaScript 下岗的策略

依旧离毕业遥遥无期...

谢谢

阿里@黯晓 @hijiangtao

2017.7