nv-buf-storage 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DIST/nv-buf-storage-bw.js +34 -0
- package/README.md +279 -0
- package/TEST/check-date.js +33 -0
- package/TEST/check-dump-load.js +70 -0
- package/TEST/check-json.js +32 -0
- package/TEST/check-rgx.js +33 -0
- package/TEST/check-ta.js +33 -0
- package/TEST/check.js +199 -0
- package/TEST/perf-file.js +62 -0
- package/TEST/perf-path.js +39 -0
- package/TEST/perf.js +733 -0
- package/TEST/tst.sh +9 -0
- package/clses/non-scalable.js +28 -0
- package/clses/scalable.js +28 -0
- package/com.sh +1 -0
- package/index.d.ts +108 -0
- package/index.js +148 -0
- package/mthds/cmmn.js +576 -0
- package/mthds/non-scalable.js +9 -0
- package/mthds/scalable.js +36 -0
- package/package.json +25 -0
- package/util.js +63 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const {add_mthds} = require("nv-facutil-simple-patch-cls");
|
|
2
|
+
|
|
3
|
+
const _fl = require("nv-buf-free-list2");
|
|
4
|
+
const _cmmn_mthds = require("../mthds/cmmn");
|
|
5
|
+
const _specific_mthds = require("../mthds/non-scalable");
|
|
6
|
+
|
|
7
|
+
function NonScalableStorage(ta_or_freelist,data_u8a) {
|
|
8
|
+
if(ta_or_freelist.buffer && ta_or_freelist.byteOffset !== undefined && ta_or_freelist.byteLength !== undefined) {
|
|
9
|
+
const FreeList = _fl.NonScalableFreeList;
|
|
10
|
+
this._fl = new FreeList(ta_or_freelist);
|
|
11
|
+
} else {
|
|
12
|
+
this._fl = ta_or_freelist;
|
|
13
|
+
}
|
|
14
|
+
this._data = data_u8a;
|
|
15
|
+
this._dv = new DataView(this._data.buffer,this._data.byteOffset,this._data.byteLength);
|
|
16
|
+
Object.defineProperty(this,"_fl", {enumerable:false});
|
|
17
|
+
Object.defineProperty(this,"_dv", {enumerable:false});
|
|
18
|
+
Object.seal(this);
|
|
19
|
+
}
|
|
20
|
+
add_mthds(NonScalableStorage,_cmmn_mthds);
|
|
21
|
+
add_mthds(NonScalableStorage,_specific_mthds);
|
|
22
|
+
|
|
23
|
+
Object.defineProperty(NonScalableStorage.prototype,"cond_is_scalable",{get:function(){return false}});
|
|
24
|
+
Object.defineProperty(NonScalableStorage.prototype,"underlying_bytsz",{get:function(){return this._fl.buf.byteLength+this._data.byteLength;}});
|
|
25
|
+
|
|
26
|
+
module.exports = NonScalableStorage;
|
|
27
|
+
|
|
28
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const {add_mthds} = require("nv-facutil-simple-patch-cls");
|
|
2
|
+
|
|
3
|
+
const _fl = require("nv-buf-free-list2");
|
|
4
|
+
const _cmmn_mthds = require("../mthds/cmmn");
|
|
5
|
+
const _specific_mthds = require("../mthds/scalable");
|
|
6
|
+
|
|
7
|
+
function ScalableStorage(ta_or_freelist,data_u8a) {
|
|
8
|
+
if(ta_or_freelist.buffer && ta_or_freelist.byteOffset !== undefined && ta_or_freelist.byteLength !== undefined) {
|
|
9
|
+
const FreeList = _fl.ScalableFreeList;
|
|
10
|
+
this._fl = new FreeList(ta_or_freelist);
|
|
11
|
+
} else {
|
|
12
|
+
this._fl = ta_or_freelist;
|
|
13
|
+
}
|
|
14
|
+
this._data = data_u8a;
|
|
15
|
+
this._dv = new DataView(this._data.buffer,this._data.byteOffset,this._data.byteLength);
|
|
16
|
+
Object.defineProperty(this,"_fl", {enumerable:false});
|
|
17
|
+
Object.defineProperty(this,"_dv", {enumerable:false});
|
|
18
|
+
Object.seal(this);
|
|
19
|
+
}
|
|
20
|
+
add_mthds(ScalableStorage,_cmmn_mthds);
|
|
21
|
+
add_mthds(ScalableStorage,_specific_mthds);
|
|
22
|
+
|
|
23
|
+
Object.defineProperty(ScalableStorage.prototype,"cond_is_scalable",{get:function(){return true}});
|
|
24
|
+
Object.defineProperty(ScalableStorage.prototype,"underlying_bytsz",{get:function(){return this._fl.buf.byteLength+this._data.byteLength;}});
|
|
25
|
+
|
|
26
|
+
module.exports = ScalableStorage;
|
|
27
|
+
|
|
28
|
+
|
package/com.sh
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nv_cli_build -g nvbufstorage -m -i index.js -o DIST/nv-buf-storage-bw.js
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
export type Range = [number, number];
|
|
2
|
+
|
|
3
|
+
export type DebugWriteResult = [string, Range];
|
|
4
|
+
|
|
5
|
+
export class Buf {
|
|
6
|
+
|
|
7
|
+
constructor(init_max_alocable_sz?: number, init_max_nd_cnt?: number);
|
|
8
|
+
|
|
9
|
+
dloc(r: Range): void;
|
|
10
|
+
|
|
11
|
+
aloc(sz: number): Range;
|
|
12
|
+
|
|
13
|
+
algn_aloc(sz: number, algn: number): Range;
|
|
14
|
+
|
|
15
|
+
// string
|
|
16
|
+
rstr(r: Range): string;
|
|
17
|
+
wstr(s: string): Range;
|
|
18
|
+
|
|
19
|
+
// json
|
|
20
|
+
rjson(r: Range): any;
|
|
21
|
+
wjson(o: any): Range;
|
|
22
|
+
|
|
23
|
+
// object (v8 serializer)
|
|
24
|
+
ro(r: Range): any;
|
|
25
|
+
wo(o: any): Range;
|
|
26
|
+
|
|
27
|
+
// unsigned
|
|
28
|
+
ru8(r: Range): number;
|
|
29
|
+
ru16(r: Range): number;
|
|
30
|
+
ru32(r: Range): number;
|
|
31
|
+
ru64(r: Range): bigint;
|
|
32
|
+
|
|
33
|
+
// signed
|
|
34
|
+
ri8(r: Range): number;
|
|
35
|
+
ri16(r: Range): number;
|
|
36
|
+
ri32(r: Range): number;
|
|
37
|
+
ri64(r: Range): bigint;
|
|
38
|
+
|
|
39
|
+
// float
|
|
40
|
+
rf16?(r: Range): number;
|
|
41
|
+
rf32(r: Range): number;
|
|
42
|
+
rf64(r: Range): number;
|
|
43
|
+
|
|
44
|
+
// write number
|
|
45
|
+
wu8(n: number): Range;
|
|
46
|
+
wu16(n: number, algn?: boolean): Range;
|
|
47
|
+
wu32(n: number, algn?: boolean): Range;
|
|
48
|
+
wu64(n: bigint | number, algn?: boolean): Range;
|
|
49
|
+
|
|
50
|
+
wi8(n: number): Range;
|
|
51
|
+
wi16(n: number, algn?: boolean): Range;
|
|
52
|
+
wi32(n: number, algn?: boolean): Range;
|
|
53
|
+
wi64(n: bigint | number, algn?: boolean): Range;
|
|
54
|
+
|
|
55
|
+
wf16?(n: number, algn?: boolean): Range;
|
|
56
|
+
wf32(n: number, algn?: boolean): Range;
|
|
57
|
+
wf64(n: number, algn?: boolean): Range;
|
|
58
|
+
|
|
59
|
+
// typed arrays read
|
|
60
|
+
ru8a(r: Range): Uint8Array;
|
|
61
|
+
ru8ca(r: Range): Uint8ClampedArray;
|
|
62
|
+
ru16a(r: Range): Uint16Array;
|
|
63
|
+
ru32a(r: Range): Uint32Array;
|
|
64
|
+
ru64a(r: Range): BigUint64Array;
|
|
65
|
+
|
|
66
|
+
ri8a(r: Range): Int8Array;
|
|
67
|
+
ri16a(r: Range): Int16Array;
|
|
68
|
+
ri32a(r: Range): Int32Array;
|
|
69
|
+
ri64a(r: Range): BigInt64Array;
|
|
70
|
+
|
|
71
|
+
rf16a?(r: Range): Float16Array;
|
|
72
|
+
rf32a(r: Range): Float32Array;
|
|
73
|
+
rf64a(r: Range): Float64Array;
|
|
74
|
+
|
|
75
|
+
rdv(r: Range): DataView;
|
|
76
|
+
|
|
77
|
+
// typed arrays write
|
|
78
|
+
wu8a(a: Uint8Array): Range;
|
|
79
|
+
wu8ca(a: Uint8ClampedArray): Range;
|
|
80
|
+
wu16a(a: Uint16Array): Range;
|
|
81
|
+
wu32a(a: Uint32Array): Range;
|
|
82
|
+
wu64a(a: BigUint64Array): Range;
|
|
83
|
+
|
|
84
|
+
wi8a(a: Int8Array): Range;
|
|
85
|
+
wi16a(a: Int16Array): Range;
|
|
86
|
+
wi32a(a: Int32Array): Range;
|
|
87
|
+
wi64a(a: BigInt64Array): Range;
|
|
88
|
+
|
|
89
|
+
wf16a?(a: Float16Array): Range;
|
|
90
|
+
wf32a(a: Float32Array): Range;
|
|
91
|
+
wf64a(a: Float64Array): Range;
|
|
92
|
+
|
|
93
|
+
wdv(v: DataView): Range;
|
|
94
|
+
|
|
95
|
+
// debug
|
|
96
|
+
debug_read(t: string, r: Range): any;
|
|
97
|
+
debug_write(o: any): DebugWriteResult;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
declare function create(init_max_alocable_sz?: number, init_max_nd_cnt?: number): Buf;
|
|
101
|
+
|
|
102
|
+
declare namespace create {
|
|
103
|
+
export { Buf };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export = create;
|
|
107
|
+
|
|
108
|
+
|
package/index.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
const {is_overlaped,get_cls_from_dump_fst_byte} = require("nv-facutil-slct-ta");
|
|
2
|
+
const _fl = require("nv-buf-free-list2");
|
|
3
|
+
const _util = require("./util");
|
|
4
|
+
|
|
5
|
+
const ScalableStorage = require("./clses/scalable");
|
|
6
|
+
const NonScalableStorage = require("./clses/non-scalable");
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
_COND_IS_NODE_ENV,
|
|
11
|
+
read_sz_from_sz_buf,
|
|
12
|
+
sync_read_segment_from_file,
|
|
13
|
+
read_preload_info,
|
|
14
|
+
read_brief_info_from_dump,
|
|
15
|
+
} = _util;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
const creat = (
|
|
19
|
+
init_max_alocable_sz=8192,
|
|
20
|
+
init_max_nd_cnt=64,
|
|
21
|
+
scalable = true,
|
|
22
|
+
fl_underlying =null,
|
|
23
|
+
data_underlying=null
|
|
24
|
+
) => {
|
|
25
|
+
var fl = _fl(init_max_alocable_sz,init_max_nd_cnt,scalable,fl_underlying);
|
|
26
|
+
var u8a;
|
|
27
|
+
if(data_underlying === null) {
|
|
28
|
+
u8a = new Uint8Array(init_max_alocable_sz);
|
|
29
|
+
} else {
|
|
30
|
+
var data_underlying_src = data_underlying.src;
|
|
31
|
+
var data_underlying_si = data_underlying.offset??0;
|
|
32
|
+
var data_underlying_ei = data_underlying_si + init_max_alocable_sz;
|
|
33
|
+
if(is_overlaped(fl.buf,[data_underlying_src,data_underlying_si,data_underlying_ei])) {
|
|
34
|
+
throw(new Error(`freelist underlying is overlaped with data underlying`));
|
|
35
|
+
} else {
|
|
36
|
+
u8a = new Uint8Array(data_underlying_src,data_underlying_si,init_max_alocable_sz);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const Storage = scalable?ScalableStorage:NonScalableStorage;
|
|
40
|
+
return new Storage(fl.buf,u8a);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const load = async (src,data,scalable = true) => {
|
|
44
|
+
const Storage = scalable?ScalableStorage:NonScalableStorage;
|
|
45
|
+
if(data !== undefined) {
|
|
46
|
+
var fl = await _fl.load(src,scalable);
|
|
47
|
+
if(_COND_IS_NODE_ENV && typeof(data)=== "string") {
|
|
48
|
+
const _path = require("path");const _fs = require("fs"); const src_fn = _path.resolve(data); const _rfile = require("nv-file-read2").simple;
|
|
49
|
+
var pair = await _rfile(src_fn,0,Infinity,Infinity,{_fs,_path});
|
|
50
|
+
if(pair[0]) {
|
|
51
|
+
data = pair[1];
|
|
52
|
+
} else {
|
|
53
|
+
throw(pair[1]);
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
//
|
|
59
|
+
var actual_sz = data.byteLength;
|
|
60
|
+
var expected_sz = fl.max_alocable_unit_cnt_v;
|
|
61
|
+
if(actual_sz < expected_sz) {
|
|
62
|
+
var ndata = new Uint8Array(expected_sz);
|
|
63
|
+
ndata.set(data,0);
|
|
64
|
+
data = ndata;
|
|
65
|
+
} else {
|
|
66
|
+
}
|
|
67
|
+
return new Storage(fl,data);
|
|
68
|
+
} else {
|
|
69
|
+
var fl; var datasz;
|
|
70
|
+
//整体 ["flsz(f64le)","fl(u8a)","datasz(f64le)","data(u8a)"];
|
|
71
|
+
if(_COND_IS_NODE_ENV && typeof(src)=== "string") {
|
|
72
|
+
const _path = require("path");const _fs = require("fs"); const src_fn = _path.resolve(src); const _rfile = require("nv-file-read2").simple;
|
|
73
|
+
var {flsz,max_alocable_unit_cnt_v} = read_preload_info(src_fn,_fs);
|
|
74
|
+
var dataszu8a = sync_read_segment_from_file(src_fn,8+flsz,8,_fs);
|
|
75
|
+
datasz = read_sz_from_sz_buf(dataszu8a);
|
|
76
|
+
var pair0 = await _rfile(src_fn,8, 8+flsz, 65536,{_fs,_path});
|
|
77
|
+
var pair1 = await _rfile(src_fn,8+flsz+8,Infinity,65536,{_fs,_path});
|
|
78
|
+
if(pair0[0] && pair1[0]) {
|
|
79
|
+
fl = await _fl.load(pair0[1],scalable);
|
|
80
|
+
data = pair1[1];
|
|
81
|
+
} else if(pair0[0]) {
|
|
82
|
+
throw(pair0[1])
|
|
83
|
+
} else if(pair1[0]){
|
|
84
|
+
throw(pair1[1])
|
|
85
|
+
} else {
|
|
86
|
+
throw([pair0[1],pair1[1]])
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
var u8a = src;
|
|
90
|
+
var {flsz,max_alocable_unit_cnt_v} = read_preload_info(u8a,undefined);
|
|
91
|
+
fl = await _fl.load(u8a.subarray(8,8+flsz),scalable);
|
|
92
|
+
var dv = new DataView(u8a.buffer);
|
|
93
|
+
datasz = dv.getFloat64(8+flsz,true);
|
|
94
|
+
data = u8a.subarray(8+flsz+8);
|
|
95
|
+
}
|
|
96
|
+
////
|
|
97
|
+
{
|
|
98
|
+
var actual_sz = data.byteLength;
|
|
99
|
+
var expected_sz = fl.max_alocable_unit_cnt_v;
|
|
100
|
+
if(actual_sz < expected_sz) {
|
|
101
|
+
var ndata = new Uint8Array(expected_sz);
|
|
102
|
+
ndata.set(data,0);
|
|
103
|
+
data = ndata;
|
|
104
|
+
} else {
|
|
105
|
+
}
|
|
106
|
+
return new Storage(fl,data);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
module.exports = creat;
|
|
113
|
+
module.exports.load = load;
|
|
114
|
+
module.exports.ScalableStorage = ScalableStorage;
|
|
115
|
+
module.exports.NonScalableStorage = NonScalableStorage;
|
|
116
|
+
//
|
|
117
|
+
module.exports._util = _util;
|
|
118
|
+
|
|
119
|
+
const creat_non_scalable_on_external_ab = (
|
|
120
|
+
underlying_ab,underlying_offset =0,
|
|
121
|
+
init_max_alocable_sz=1024*1024*1024*128,
|
|
122
|
+
init_max_nd_cnt =2**26,
|
|
123
|
+
)=>{
|
|
124
|
+
var flsz = _fl._type.calc_fl_underlying_bytsz(init_max_alocable_sz,init_max_nd_cnt);
|
|
125
|
+
return creat(init_max_alocable_sz,init_max_nd_cnt,false,{src:underlying_ab,offset:underlying_offset},{src:underlying_ab, offset:underlying_offset+flsz});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const load_non_scalable_from_external_ab = (
|
|
129
|
+
underlying_ab,
|
|
130
|
+
underlying_offset =0,
|
|
131
|
+
underlying_sz
|
|
132
|
+
)=>{
|
|
133
|
+
underlying_sz = underlying_sz??underlying_ab.byteLength-underlying_offset;
|
|
134
|
+
var u8a = new Uint8Array(underlying_ab,underlying_offset,underlying_sz);
|
|
135
|
+
const TaCls = get_cls_from_dump_fst_byte(u8a[0]);
|
|
136
|
+
var preload = new TaCls(underlying_ab,underlying_offset,6);
|
|
137
|
+
var datasz = preload[5];
|
|
138
|
+
var flsz = underlying_sz - datasz;
|
|
139
|
+
var flta = new TaCls(underlying_ab,underlying_offset,flsz/TaCls.BYTES_PER_ELEMENT);
|
|
140
|
+
var fl = new _fl.NonScalableFreeList(flta);
|
|
141
|
+
var data = new Uint8Array(underlying_ab,flsz,datasz);
|
|
142
|
+
return new NonScalableStorage(fl,data);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
module.exports.creat_non_scalable_on_external_ab = creat_non_scalable_on_external_ab;
|
|
146
|
+
module.exports.load_non_scalable_from_external_ab = load_non_scalable_from_external_ab;
|
|
147
|
+
|
|
148
|
+
|