NodeJS JSON.parse(...)需要永远完成(在WebStorm中的调试器下)

时间:2013-11-02 22:50:05

标签: json node.js 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%。我无法调试该函数,因为它是原生函数。

Here是JSON的ASCI版本

Here是JSON的UTF8版本

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您遇到的问题是 JSON解析耗时太长。的确,试试这个:

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

您可能会发现它花了不到一秒左右的时间。

您遇到的问题是调试器本身的问题 - 观察者效应。观察系统的行为改变了该系统。

我假设您正在使用节点检查器。每当你有一个非常大的复杂对象时,将对象加载到检查器中是非常昂贵的。在执行此操作时,您的节点进程将挂起CPU并暂停事件循环。

我的猜测是JSON被解析并且创建了一个巨大的(假设我们正在处理5MB)对象。然后节点点击第二个debugger,检查员需要加载本地。极其缓慢的过程开始了,检查员不会证明你已经到达断点,直到它完成。所以对你来说它看起来很冷。

尝试用小的东西替换你的JSON文件(比如{a:1})。它应该快速加载。


你真的需要目视检查整个物体吗?有些工具更适合查看JSON文件。

答案 1 :(得分:2)

您可以require .json文件。所以,不需要解析。

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

应该这样做!

答案 2 :(得分:2)

+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);
});