NodeJS JSON.parse() отнема цял живот (под дебъгер в WebStorm)

РЕДАКТИРАНЕ

Проблемът изглежда е свързан със самия WebStorm, изглежда, че той не иска да работи с обекти, съдържащи огромно количество вложени обекти. Нито иска да показва съдържанието на обекта в прозореца Watches. Проблемът е доста странен, защото мога да проверя низа, той се зарежда светкавично бързо. Изглежда като проблем с WebStorm


Имам сравнително голям JSON файл 4,9mb, който трябва да обработя в NodeJS, файлът се съхранява във файловата система и се зарежда с помощта на следните редове код:

var path = require('path');

var filename = path.join(__dirname, 'db_asci.json');
var fs = require('fs');

var content = fs.readFileSync(filename);

debugger;
var decycledObj = JSON.parse(content);
debugger;

Проблема е, че след като първата debugger; брейкпойнт е ударена, втората не е, чакам повече от 20 минути и нищо, едното процесорно ядро ​​е натоварено на 100%. Не мога да отстраня грешки във функцията, защото е естествена.

Ето ASCI версия на JSON

Ето UTF8 версия на JSON

какво правя грешно


person Lu4    schedule 02.11.2013    source източник


Отговори (3)


Проблемът, с който се сблъсквате, е, че не анализът на JSON отнема твърде много време. Всъщност опитайте това:

var start = Date.now();
var obj = JSON.parse(fs.readFileSync(filename));
console.log('Took', Date.now() - start, 'ms');

Вероятно ще видите, че отне по-малко от секунда или нещо такова.

Това, с което се сблъсквате, е проблем със самия дебъгер ефекта на наблюдателя. Актът на наблюдение на система променя тази система.

Предполагам, че използвате инспектор на възли. Винаги, когато имате изключително голям, сложен обект, е изключително скъпо да заредите обекта в инспектора. Докато го прави, процесът на вашия възел ще закачи процесора и цикълът на събитията е поставен на пауза.

Предполагам, че JSON се анализира и се създава огромен (като се има предвид, че имаме работа с 5MB) обект. След това Node удря втория debugger и инспекторът трябва да зареди локални данни. Мъчително бавният процес започва и инспекторът няма да покаже, че сте достигнали точка на прекъсване, докато не приключи. Така че за вас просто изглежда замръзнало.

Опитайте да замените вашия JSON файл с нещо малко (като {a:1}). Трябва да се зареди бързо.


Наистина ли трябва да прегледате визуално целия обект? Има инструменти, по-подходящи за преглед на JSON файлове.

person josh3736    schedule 03.11.2013
comment
Но мога да наблюдавам низа (използвам WebStorm) низът също е с размер 5mb и се зарежда толкова бързо, колкото... Е, зарежда се бързо... - person Lu4; 03.11.2013
comment
Но наистина изглежда, че е проблем с дебъгера, така че вашата публикация изглежда е отговорът на въпроса. - person Lu4; 03.11.2013

Можете да изисквате .json файлове. Така че няма нужда от анализ.

var content = require('./db_asci.json');

Това трябва да го направи!

person Pradeep Mahdevu    schedule 02.11.2013
comment
Защо това ще бъде по-бързо? - person WiredPrairie; 03.11.2013
comment
Това не прави абсолютно нищо особено. Когато require файл, завършващ на .json, всичко, което прави, е да извика fs.readFileSync и да го предаде на JSON.parse. С други думи, точно това, което OP вече прави. - person josh3736; 03.11.2013

+1 за решението на Pradeep Mahdevu, ето друг начин за същото нещо (редактирайте с асинхронната версия)

var fs = require ('fs');
var options = { encoding: 'utf8' };
var jsonData = fs.readFile('db_asci.json', options, function (err, data) {
  if (err) throw err;
  var object = JSON.parse(data);
});
person alfonsodev    schedule 02.11.2013
comment
Как това се различава от оригиналното решение на OP? - person Aaron Dufour; 03.11.2013
comment
readFileSync е просто .... не stackoverflow.com/questions/13822085/ - person cillierscharl; 03.11.2013
comment
@f0x-и въпросът не беше за това. Беше около времето за анализ. - person WiredPrairie; 03.11.2013
comment
Изтеглих файла, който той публикува, и стартирах тези 3 реда и той проработи за по-малко от секунда. Може би можете да проверите при първото отстраняване на грешки дали вашата променлива на съдържанието не е празна. Единствената разлика е пътят и параметърът за кодиране. - person alfonsodev; 03.11.2013