-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.js
More file actions
139 lines (129 loc) · 4.97 KB
/
test.js
File metadata and controls
139 lines (129 loc) · 4.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import perspective from '@finos/perspective';
import * as aq from 'arquero';
import fs from 'node:fs';
let testData = null;
function generateData() {
const dataEndTs = Date.now();
const dataEntries = 10 * 24 * 60 * 60; // 10 days of data
const tsIncrement = 1000; // entry for each 1 sec
const dataStartTs = dataEndTs - tsIncrement * dataEntries;
const data = [];
let currTs = dataStartTs;
for (let i = 0; i < dataEntries; i++) {
const dataEntry = { ts: currTs, value: i };
data.push(dataEntry);
currTs += tsIncrement;
}
testData = data;
}
function formatBytes(a, b) {
if (0 === a) return `0 `;
let c = 1e3,
d = b || 2,
e = ['Bytes', 'KB', 'MB', 'GB'],
f = Math.floor(Math.log(Math.abs(a)) / Math.log(c));
return `${parseFloat((a / Math.pow(c, f)).toFixed(d))} ${e[f]}`;
}
function memDiff(info, memBefore, memAfter) {
let msg = `Memory increase: ${info}\n`;
msg += ` RSS : ${formatBytes(memAfter.rss - memBefore.rss, 2)} (${memBefore.rss} -> ${memAfter.rss})\n`;
msg += ` HeapTotal: ${formatBytes(memAfter.heapTotal - memBefore.heapTotal, 2)} (${memBefore.heapTotal} -> ${memAfter.heapTotal})\n`;
msg += ` HeapUsed : ${formatBytes(memAfter.heapUsed - memBefore.heapUsed, 2)} (${memBefore.heapUsed} -> ${memAfter.heapUsed})\n`;
msg += ` External : ${formatBytes(memAfter.external - memBefore.external, 2)} (${memBefore.external} -> ${memAfter.external})\n`;
if ('arrayBuffers' in memBefore) {
msg += ` arrayBuffers : ${formatBytes(memAfter.arrayBuffers - memBefore.arrayBuffers, 2)} (${memBefore.arrayBuffers} -> ${memAfter.arrayBuffers})\n`;
}
if ('wasmHeap' in memBefore) {
msg += ` wasmHeap : ${formatBytes(memAfter.wasmHeap - memBefore.wasmHeap, 2)} (${memBefore.wasmHeap} -> ${memAfter.wasmHeap})\n`;
}
console.log(msg);
}
async function aggQuery(pTable) {
const view = await pTable.view({
columns: ['tb', 'value'],
expressions: [`//tb\nbucket("ts", '1m')`],
group_by: ['tb'],
aggregates: { value: 'count' },
});
return view;
}
async function testPerspective() {
console.log(`\nPerspective Table Test: data load from array`);
global.gc();
let startMemUsage = await perspective.memory_usage();
let startTs = Date.now();
const pTable = await perspective.table({ ts: 'datetime', value: 'integer' });
await pTable.update(testData);
let loadTs = Date.now();
global.gc();
let endMemUsage = await perspective.memory_usage();
memDiff('Perspective data load from array', startMemUsage, endMemUsage);
let numRows = await pTable.num_rows();
console.log(`Table load time: ${loadTs - startTs} msec, rows: ${numRows}`);
const qStartTs = Date.now();
const qView = await aggQuery(pTable);
const qEndTs = Date.now();
const resJson = await qView.to_json();
console.log(`Aggregation query time: ${qEndTs - qStartTs} msec, result rows: ${resJson.length - 1}`);
await qView.delete();
const v = await pTable.view();
let arrowData = await v.to_arrow();
fs.writeFileSync('dataset.arrow', Buffer.from(arrowData));
arrowData = null;
await v.delete();
await pTable.delete();
global.gc();
}
async function testPerspectiveFromArrow() {
console.log(`\nPerspective Table Test: data load from Arrow dataset`);
global.gc();
let startMemUsage = await perspective.memory_usage();
let startTs = Date.now();
const arrowData = fs.readFileSync('dataset.arrow');
const pTable = await perspective.table(arrowData);
let loadTs = Date.now();
global.gc();
let endMemUsage = await perspective.memory_usage();
memDiff('Perspective data load from Arrow dataset', startMemUsage, endMemUsage);
let numRows = await pTable.num_rows();
console.log(`Table load time: ${loadTs - startTs} msec, rows: ${numRows}`);
const qStartTs = Date.now();
const qView = await aggQuery(pTable);
const qEndTs = Date.now();
const resJson = await qView.to_json();
console.log(`Aggregation query time: ${qEndTs - qStartTs} msec, result rows: ${resJson.length - 1}`);
await qView.delete();
await pTable.delete();
global.gc();
}
async function testArquero() {
console.log(`\nArquero Table Test: data load from array`);
global.gc();
let startMemUsage = process.memoryUsage();
let startTs = Date.now();
const arqTable = aq.from(testData);
let loadTs = Date.now();
global.gc();
let endMemUsage = process.memoryUsage();
memDiff('Arquero data load from array', startMemUsage, endMemUsage);
let numRows = arqTable.numRows();
console.log(`Table load time: ${loadTs - startTs} msec, rows: ${numRows}`);
const qStartTs = Date.now();
const qRes = arqTable
.groupby({
key: (d) => Math.floor(d.ts / 60000) * 60000,
})
.rollup({ mean: (d) => aq.op.count() });
const qEndTs = Date.now();
console.log(`Aggregation query time: ${qEndTs - qStartTs} msec, result rows: ${qRes.numRows()}`);
}
async function main() {
generateData();
await testPerspective();
await testPerspectiveFromArrow();
await testArquero();
}
main().catch((e) => {
console.log(`Exception: ${e.message} ${e.stack}`);
process.exit(-1);
});