1 | 'use strict';
|
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 | var crypto = require("crypto");
|
35 | var loki = require('../src/lokijs.js');
|
36 | var lfsa = require('../src/loki-fs-structured-adapter.js');
|
37 |
|
38 |
|
39 | var numCollections = 2;
|
40 |
|
41 |
|
42 |
|
43 | var numObjects = 150000;
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | var mode = "fs-structured-partitioned";
|
53 |
|
54 | var adapter;
|
55 |
|
56 | switch (mode) {
|
57 | case "fs-normal":
|
58 | case "fs-structured": adapter = new loki.LokiFsAdapter(); break;
|
59 | case "fs-partitioned": adapter = new loki.LokiPartitioningAdapter(new loki.LokiFsAdapter()); break;
|
60 | case "fs-structured-partitioned" : adapter = new lfsa(); break;
|
61 | default:adapter = new loki.LokiFsAdapter(); break;
|
62 | };
|
63 |
|
64 | console.log(mode);
|
65 |
|
66 | var db = new loki('sandbox.db', {
|
67 | adapter : adapter,
|
68 | serializationMethod: (mode === "fs-structured")?"destructured":"normal"
|
69 | });
|
70 |
|
71 |
|
72 |
|
73 | function genRandomVal() {
|
74 | return crypto.randomBytes(50).toString('hex');
|
75 | }
|
76 |
|
77 | function stepInsertObjects() {
|
78 | var cidx, idx;
|
79 |
|
80 | for (cidx=0; cidx < numCollections; cidx++) {
|
81 | var items = db.addCollection('items' + cidx);
|
82 |
|
83 | for(idx=0; idx<numObjects; idx++) {
|
84 | items.insert({
|
85 | start : (new Date()).getTime(),
|
86 | first : genRandomVal(),
|
87 | owner: genRandomVal(),
|
88 | maker: genRandomVal(),
|
89 | orders: [
|
90 | genRandomVal(),
|
91 | genRandomVal(),
|
92 | genRandomVal(),
|
93 | genRandomVal(),
|
94 | genRandomVal()
|
95 | ],
|
96 | attribs: {
|
97 | a: genRandomVal(),
|
98 | b: genRandomVal(),
|
99 | c: genRandomVal(),
|
100 | d: {
|
101 | d1: genRandomVal(),
|
102 | d2: genRandomVal(),
|
103 | d3: genRandomVal()
|
104 | }
|
105 | }
|
106 | });
|
107 | }
|
108 |
|
109 | console.log('inserted ' + numObjects + ' documents');
|
110 | }
|
111 | }
|
112 |
|
113 | function stepSaveDatabase() {
|
114 | var start, end;
|
115 |
|
116 | start = process.hrtime();
|
117 |
|
118 | db.saveDatabase(function(err) {
|
119 | if (err === null) {
|
120 | console.log('finished saving database');
|
121 | logMemoryUsage("after database save : ");
|
122 | end = process.hrtime(start);
|
123 | console.info("database save time : %ds %dms", end[0], end[1]/1000000);
|
124 | }
|
125 | else {
|
126 | console.log('error encountered saving database : ' + err);
|
127 | }
|
128 | });
|
129 | }
|
130 |
|
131 | function step4ReloadDatabase() {
|
132 | db = new loki('sandbox.db', {
|
133 | verbose: true,
|
134 | autoload: true,
|
135 | autoloadCallback: dbLoaded
|
136 | });
|
137 | }
|
138 |
|
139 | function formatBytes(bytes,decimals) {
|
140 | if(bytes == 0) return '0 Byte';
|
141 | var k = 1000;
|
142 | var dm = decimals + 1 || 3;
|
143 | var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
144 | var i = Math.floor(Math.log(bytes) / Math.log(k));
|
145 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
146 | }
|
147 |
|
148 | function logMemoryUsage(msg) {
|
149 | var pmu = process.memoryUsage();
|
150 | console.log(msg + " > rss : " + formatBytes(pmu.rss) + " heapTotal : " + formatBytes(pmu.heapTotal) + " heapUsed : " + formatBytes(pmu.heapUsed));
|
151 | }
|
152 |
|
153 | logMemoryUsage("before document inserts : ");
|
154 | stepInsertObjects();
|
155 |
|
156 | logMemoryUsage("after document inserts : ");
|
157 | stepSaveDatabase();
|
158 |
|