1

编辑

这个问题似乎与 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%加载。我无法调试该功能,因为它是本机的。

是 JSON 的 ASCI 版本

是 UTF8 版本的 JSON

我究竟做错了什么?

4

3 回答 3

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 文件。

于 2013-11-03T00:20:48.407 回答
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);
});
于 2013-11-02T23:20:21.930 回答
1

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

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

应该这样做!

于 2013-11-02T23:16:55.940 回答