Open
Description
node @v4.4.7
jsondiffpatch @0.1.43
while taking diff for very large arrays (it could contain more than 5k objects), I encounter this error.
/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/arrays.js:42
function matchItems(array1, array2, index1, index2, context) {
^
RangeError: Maximum call stack size exceeded
at Array.matchItems [as match] (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/arrays.js:42:20)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:49:14)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:50:23)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:58:12)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:60:12)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:60:12)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:50:23)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:60:12)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:50:23)
at backtrack (/Users/malhar.trivedi/node_modules/jsondiffpatch/src/filters/lcs.js:58:12)
Here's the sample code to reproduce this error. This sample data has large array size because value of object size is relatively small. as I increase object size, I can further reduce size of array.
'use strict';
const jsondiffpatch = require('jsondiffpatch');
const options = {
objectHash: function (obj) {
return obj.id || JSON.stringify(obj);
}
};
const ARRAY_LENGTH = 7000;
const seedData = {
field1: 'some string data',
field2: 'some another string data. Este es completa basura escrito en español',
field3: 'This is a complete garbage and should not be considered even',
timestamp: Date.now()
};
const LARGE_STRING = 'This becomes much more larger field than it was before. It might even contain unicode characters as well \uFFFF \
This one has completely different characters than it used to before \uFFFF';
function createData(){
let result = [];
for (let i=0; i < ARRAY_LENGTH; i++) {
if(Math.random() > 0.5) {
result.push(Object.assign({}, seedData, {
timestamp: Date.now(),
field1 : LARGE_STRING,
field3 : LARGE_STRING
}));
} else {
result.push(seedData);
}
}
return result;
}
function testForLargeArray () {
let largeArray1 = createData();
let largeArray2 = createData();
let differ = jsondiffpatch.create(options);
let diff = differ.diff(largeArray1, largeArray2);
}
testForLargeArray();
Metadata
Metadata
Assignees
Labels
No labels