Public
Edited
Dec 10, 2024
Paused
2 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function newchunked(a = new Float32Array(), n = 5, balanced = true) {
if (n < 2) return [a.buffer.slice(0)];

const len = a.length;
const bytesPerElement = a.BYTES_PER_ELEMENT;
const totalBytes = a.byteLength;
const out = [];
let i = 0;
let size;

function pushBuffer(start, end) {
const byteStart = start * bytesPerElement
const byteEnd = end * bytesPerElement
const byteLength = byteEnd - byteStart;
let t1 = performance.now()
// formal copy
/*const buffer = new ArrayBuffer(byteLength);
const view = new Uint8Array(buffer);
const sourceView = new Uint8Array(a.buffer, byteStart, byteLength);
view.set(sourceView);
out.push(buffer);*/

// easy copy
out.push(a.buffer.slice(byteStart,byteEnd));
// console.log(~~(performance.now()-t1))
}

if (len % n === 0) {
size = Math.floor(len / n);
while (i < len) {
pushBuffer(i, i + size);
i += size;
}
} else if (balanced) {
while (i < len) {
size = Math.ceil((len - i) / n--);
pushBuffer(i, i + size);
i += size;
}
} else {
n--;
size = Math.floor(len / n);
if (len % size === 0) size--;
while (i < size * n) {
pushBuffer(i, i + size);
i += size;
}
pushBuffer(i, len);
}

return out;
}
Insert cell
// reduce based chunker

function copychunk(arr, n = 1) {
n = Math.ceil(arr.length / n)
if (n <= 0) throw new Error("Chunk size must be a positive integer");
return arr.reduce((acc, _, i) => {
if (i % n === 0) acc.push(arr.slice(i, i + n).buffer);
return acc;
}, []);
}
Insert cell
// calculates buffer offsets given an array

function buffset(a = new Float32Array(), n = 5, balanced = true) {
if (n < 2) return [{byteStart:0,byteEnd:a.buffer.byteLength}];

const len = a.length;
const bytesPerElement = a.BYTES_PER_ELEMENT;
const totalBytes = a.byteLength;
const out = [];
let i = 0;
let size;

function calcBuffer(start, end) {
const byteStart = start * bytesPerElement
const byteEnd = end * bytesPerElement
const byteLength = byteEnd - byteStart;
out.push({byteStart,byteEnd})
}

if (len % n === 0) {
size = Math.floor(len / n);
while (i < len) {
calcBuffer(i, i + size);
i += size;
}
} else if (balanced) {
while (i < len) {
size = Math.ceil((len - i) / n--);
calcBuffer(i, i + size);
i += size;
}
} else {
n--;
size = Math.floor(len / n);
if (len % size === 0) size--;
while (i < size * n) {
calcBuffer(i, i + size);
i += size;
}
calcBuffer(i, len);
}

return out;
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more