123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- return // dont run this test for now since tape is weird and broken on 0.10
- var fs = require('fs')
- var JSONStream = require('../')
- var file = process.argv[2] || '/tmp/JSONStream-test-large.json'
- var size = Number(process.argv[3] || 100000)
- var tape = require('tape')
- // if (process.title !== 'browser') {
- tape('out of mem', function (t) {
- t.plan(1)
- //////////////////////////////////////////////////////
- // Produces a random number between arg1 and arg2
- //////////////////////////////////////////////////////
- var randomNumber = function (min, max) {
- var number = Math.floor(Math.random() * (max - min + 1) + min);
- return number;
- };
- //////////////////////////////////////////////////////
- // Produces a random string of a length between arg1 and arg2
- //////////////////////////////////////////////////////
- var randomString = function (min, max) {
- // add several spaces to increase chanses of creating 'words'
- var chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- var result = '';
- var randomLength = randomNumber(min, max);
- for (var i = randomLength; i > 0; --i) {
- result += chars[Math.round(Math.random() * (chars.length - 1))];
- }
- return result;
- };
- //////////////////////////////////////////////////////
- // Produces a random JSON document, as a string
- //////////////////////////////////////////////////////
- var randomJsonDoc = function () {
- var doc = {
- "CrashOccurenceID": randomNumber(10000, 50000),
- "CrashID": randomNumber(1000, 10000),
- "SiteName": randomString(10, 25),
- "MachineName": randomString(10, 25),
- "Date": randomString(26, 26),
- "ProcessDuration": randomString(18, 18),
- "ThreadIdentityName": null,
- "WindowsIdentityName": randomString(15, 40),
- "OperatingSystemName": randomString(35, 65),
- "DetailedExceptionInformation": randomString(100, 800)
- };
- doc = JSON.stringify(doc);
- doc = doc.replace(/\,/g, ',\n'); // add new lines after each attribute
- return doc;
- };
- //////////////////////////////////////////////////////
- // generates test data
- //////////////////////////////////////////////////////
- var generateTestData = function (cb) {
- console.log('generating large data file...');
- var stream = fs.createWriteStream(file, {
- encoding: 'utf8'
- });
- var i = 0;
- var max = size;
- var writing = false
- var split = ',\n';
- var doc = randomJsonDoc();
- stream.write('[');
- function write () {
- if(writing) return
- writing = true
- while(++i < max) {
- if(Math.random() < 0.001)
- console.log('generate..', i + ' / ' + size)
- if(!stream.write(doc + split)) {
- writing = false
- return stream.once('drain', write)
- }
- }
- stream.write(doc + ']')
- stream.end();
- console.log('END')
- }
- write()
- stream.on('close', cb)
- };
- //////////////////////////////////////////////////////
- // Shows that parsing 100000 instances using JSONStream fails
- //
- // After several seconds, you will get this crash
- // FATAL ERROR: JS Allocation failed - process out of memory
- //////////////////////////////////////////////////////
- var testJSONStreamParse_causesOutOfMem = function (done) {
- var items = 0
- console.log('parsing data files using JSONStream...');
- var parser = JSONStream.parse([true]);
- var stream = fs.createReadStream(file);
- stream.pipe(parser);
- parser.on('data', function (data) {
- items++
- if(Math.random() < 0.01) console.log(items, '...')
- });
-
- parser.on('end', function () {
- t.equal(items, size)
- });
- };
- //////////////////////////////////////////////////////
- // main
- //////////////////////////////////////////////////////
- fs.stat(file, function (err, stat) {
- console.log(stat)
- if(err)
- generateTestData(testJSONStreamParse_causesOutOfMem);
- else
- testJSONStreamParse_causesOutOfMem()
- })
- })
-
- // }
|