【发布时间】:2016-09-11 12:21:50
【问题描述】:
我的一个节点进程每半秒接收一个样本点,我想更新我收到的所有样本点的历史图表。
图表应该是一个数组,其中包含从 0 到当前点的所有点的下采样历史记录。
换句话说,数组的最大长度应该是l。如果我收到的样本点多于l,我希望图表数组是整个历史记录的下采样到l 的版本。
用代码来表达:
const CHART_LENGTH = 2048
createChart(CHART_LENGTH)
onReceivePoint = function(p) {
// p can be considered a number
const chart = addPointToChart(p)
// chart is an array representing all the samples received, from 0 to now
console.assert(chart.length <= CHART_LENGTH)
}
我已经有了一个带有数字数组的下采样函数:
function downsample (arr, density) {
let i, j, p, _i, _len
const downsampled = []
for (i = _i = 0, _len = arr.length; _i < _len; i = ++_i) {
p = arr[i]
j = ~~(i / arr.length * density)
if (downsampled[j] == null) downsampled[j] = 0
downsampled[j] += Math.abs(arr[i] * density / arr.length)
}
return downsampled
}
这样做的一个简单方法显然是将我收到的所有点保存到一个数组中,并在数组增长时应用downsample 函数。这会起作用,但是,由于这段代码会在服务器中运行,可能会连续数月运行,它最终会使支持数组增长得如此之多,以至于进程会耗尽内存。
问题是:有没有办法重新使用图表本身的先前内容来构造图表数组,以避免维持不断增长的数据结构?换句话说,这个问题是否有一个恒定的内存复杂度解决方案?
请注意,图表必须包含自采样点 #0 以来的全部历史记录,因此不能接受最后 n 个点的图表。
【问题讨论】:
标签: javascript algorithm memory charts sampling