1 | return
|
2 |
|
3 | var fs = require('fs')
|
4 | var JSONStream = require('../')
|
5 | var file = process.argv[2] || '/tmp/JSONStream-test-large.json'
|
6 | var size = Number(process.argv[3] || 100000)
|
7 | var tape = require('tape')
|
8 |
|
9 | tape('out of mem', function (t) {
|
10 | t.plan(1)
|
11 |
|
12 |
|
13 |
|
14 | var randomNumber = function (min, max) {
|
15 | var number = Math.floor(Math.random() * (max - min + 1) + min);
|
16 | return number;
|
17 | };
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | var randomString = function (min, max) {
|
23 |
|
24 |
|
25 | var chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
26 | var result = '';
|
27 |
|
28 | var randomLength = randomNumber(min, max);
|
29 |
|
30 | for (var i = randomLength; i > 0; --i) {
|
31 | result += chars[Math.round(Math.random() * (chars.length - 1))];
|
32 | }
|
33 | return result;
|
34 | };
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | var randomJsonDoc = function () {
|
40 |
|
41 | var doc = {
|
42 | "CrashOccurenceID": randomNumber(10000, 50000),
|
43 | "CrashID": randomNumber(1000, 10000),
|
44 | "SiteName": randomString(10, 25),
|
45 | "MachineName": randomString(10, 25),
|
46 | "Date": randomString(26, 26),
|
47 | "ProcessDuration": randomString(18, 18),
|
48 | "ThreadIdentityName": null,
|
49 | "WindowsIdentityName": randomString(15, 40),
|
50 | "OperatingSystemName": randomString(35, 65),
|
51 | "DetailedExceptionInformation": randomString(100, 800)
|
52 | };
|
53 |
|
54 | doc = JSON.stringify(doc);
|
55 | doc = doc.replace(/\,/g, ',\n');
|
56 | return doc;
|
57 | };
|
58 |
|
59 |
|
60 |
|
61 |
|
62 | var generateTestData = function (cb) {
|
63 |
|
64 | console.log('generating large data file...');
|
65 |
|
66 | var stream = fs.createWriteStream(file, {
|
67 | encoding: 'utf8'
|
68 | });
|
69 |
|
70 | var i = 0;
|
71 | var max = size;
|
72 | var writing = false
|
73 | var split = ',\n';
|
74 | var doc = randomJsonDoc();
|
75 | stream.write('[');
|
76 |
|
77 | function write () {
|
78 | if(writing) return
|
79 | writing = true
|
80 | while(++i < max) {
|
81 | if(Math.random() < 0.001)
|
82 | console.log('generate..', i + ' / ' + size)
|
83 | if(!stream.write(doc + split)) {
|
84 | writing = false
|
85 | return stream.once('drain', write)
|
86 | }
|
87 | }
|
88 | stream.write(doc + ']')
|
89 | stream.end();
|
90 | console.log('END')
|
91 | }
|
92 | write()
|
93 | stream.on('close', cb)
|
94 | };
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 | var testJSONStreamParse_causesOutOfMem = function (done) {
|
103 | var items = 0
|
104 | console.log('parsing data files using JSONStream...');
|
105 |
|
106 | var parser = JSONStream.parse([true]);
|
107 | var stream = fs.createReadStream(file);
|
108 | stream.pipe(parser);
|
109 |
|
110 | parser.on('data', function (data) {
|
111 | items++
|
112 | if(Math.random() < 0.01) console.log(items, '...')
|
113 | });
|
114 |
|
115 | parser.on('end', function () {
|
116 | t.equal(items, size)
|
117 | });
|
118 |
|
119 | };
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 | fs.stat(file, function (err, stat) {
|
126 | console.log(stat)
|
127 | if(err)
|
128 | generateTestData(testJSONStreamParse_causesOutOfMem);
|
129 | else
|
130 | testJSONStreamParse_causesOutOfMem()
|
131 | })
|
132 |
|
133 | })
|
134 |
|
135 |
|