读取JSON文件的有效方法?

时间:2019-01-23 05:25:17

标签: javascript node.js json ajax

我已经看到了从Nodejs中的本地读取JSON文件的不同方法。像这样;

  1. 方法

    使用fs库

    同步

    var fs = require('fs');
    var obj = JSON.parse(fs.readFileSync('file', 'utf8'));
    

    异步:

    var fs = require('fs');
    var obj;
    fs.readFile('file', 'utf8', function (err, data) {
      if (err) throw err;
      obj = JSON.parse(data);
    });
    

    来源:https://stackoverflow.com/a/10011078/7724032

  2. 方法

    使用require()

    let data = require('/path/file.json');
    
  3. 方法

    使用Ajax请求 How to retrieve data from JSON file using Jquery and ajax?

可能还有其他方法。但是我听说使用方法1读取JSON文件时比其他方法有效。

我正在开发一个模块,当每个客户端请求和Im当前正在使用方法1时,我必须读取JSON文件。这是银行业务应用程序,性能至关重要。所以帮我找到哪种方法可以使用此Senario?

谢谢,任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

方法3)不在考虑范围之内,因为它将其他方法之一与网络请求结合在一起,因此您仍然必须选择其他方法之一。

我认为方法2)正在泄漏内存。如果您需要两次,NodeJS将通过引用返回完全相同的东西:

url

因此,如果您只需要一次,它将永久保留在内存中。如果您多次查找它,这会很快,但是如果您有很多文件,它将填满内存。

现在只剩下方法1),我将使用异步版本,因为它可以并行执行多个请求,如果服务器处于负载状态,它将优于sync方法。


我个人会选择选项4):

将其存储在数据库中。数据库将数据加载到内存中以加快访问速度,并且它们可以处理许多文件。在处理JSON时,Mongodb是一个不错的选择:

 require("thing") === require("thing")

答案 1 :(得分:0)

所以我创建了一个大的json文件,并测量了时间以查看哪个更快,创建文件的代码在最后并加了注释。

const fs = require('fs')

// method 1 - sync
console.time('method_1_sync ')
var obj = JSON.parse(fs.readFileSync('file.json', 'utf8'))
console.log(obj[1000] === 2000)
console.timeEnd('method_1_sync ')

// method 2
console.time('method_2      ')
let data = require('./file.json')
console.log(data[1000] === 2000)
console.timeEnd('method_2      ')

// method 1 - aysnc
console.time('method_1_async')
fs.readFile('file.json', 'utf8', function (err, data) {
  if (err) throw err
  data = JSON.parse(data)
  console.log(data[1000] === 2000)
  console.timeEnd('method_1_async')
})

/*
var obj = {}

for (i=0; i < 1000000; i++){
  obj[i] = i+i
}

var json = JSON.stringify(obj)
fs.writeFile('file.json', json, function() {})
*/

这是我机器上的结果:

method_1_sync : 131.861ms
method_2      : 131.510ms
method_1_async: 130.521ms

method_1_async似乎是最快的。由于网络延迟,方法3不值得测试。

答案 2 :(得分:0)

我回答了这个问题,并添加了用于比较require与readFile与readFileSync here的基准。