Ein Knotenprozess von mir erhält einen Abtastpunkt alle halbe Sekunde, und ich möchte das Verlaufsdiagramm aller Sample-Punkte aktualisieren, die ich erhalte. Das Diagramm sollte ein Array sein, das die Downsampling-Historie aller Punkte von 0 bis zum aktuellen Punkt enthält. Mit anderen Worten, die maximale Länge des Arrays sollte l
sein. Wenn ich mehr Beispielpunkte als l
empfange, möchte ich, dass das Diagramm-Array eine Downsample-to-l
Version der gesamten Geschichte ist.Speicher-effizientes Downsampling (Diagramm) eines wachsenden Arrays
Um es mit dem Code ausdrücken:
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)
}
Ich habe bereits eine Arbeit mit Zahlen-Arrays Abwärtsabtastens Funktion:
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
}
Eine triviale Weise, dies zu tun offenbar die Punkte alles, was ich bekommen würde, Speichern in ein Array und wenden Sie die Funktion downsample
immer wenn das Array wächst. Das würde funktionieren, aber da dieses Stück Code in einem Server laufen würde, möglicherweise für Monate und Monate in Folge, würde es schließlich dazu führen, dass das unterstützende Array so stark anwächst, dass der Prozess nicht mehr genügend Speicher hat.
Die Frage ist: Gibt es eine Möglichkeit, das Diagramm-Array zu konstruieren, die den vorherigen Inhalt des Diagramms selbst wieder verwendet, um zu vermeiden, dass eine wachsende Datenstruktur beibehalten wird? Mit anderen Worten, gibt es eine konstante Speicherkomplexitätslösung für dieses Problem?
Bitte beachten Sie, dass das Diagramm die gesamte Historie seit Beispielpunkt # 0 in jedem Moment enthalten muss, so dass das Chartieren der letzten n Punkte nicht akzeptabel wäre.
Ich bin mir nicht sicher, dass ich "am Anfang des Arrays beginnen und durchschnittlich zwei aufeinander folgende Proben" verstanden habe. Soll ich buchstäblich eine [0] und eine [1] nehmen, sie mitteln und an die Stelle von [0] setzen, indem ich das Array um eine Stelle zurückstelle? Oder soll ich a [0] und a [1], a [2] und a [3] usw. bis zum Ende des Arrays mitteln und als Ergebnis ein Array halber Länge haben? – janesconference
Das ist, was ich meinte: 'a0: = 0,5 (a0 + a1); a1: = 0,5 (a2 + a3); a2: = 0,5 (a4 + a5); ... ' –