关于javascript:读取JSON文件的有效方法?

Efficient way to read JSON file?

我在nodejs中看到了从localy读取JSON文件的不同方法。这样地;

  • 方法

    使用fs库

    同步

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

    Async:

    1
    2
    3
    4
    5
    6
    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

  • 方法

    使用要求()

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

    使用Ajax请求如何使用jquery和ajax从json文件中检索数据?

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

    我正在开发一个模块,在这个模块中,当每个客户端请求时,我必须读取一个JSON文件,而我当前使用的是方法1。这是银行应用程序,性能很重要。那么,帮我找出使用这个塞那里奥的好方法?

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


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

    我假设方法2)正在泄漏内存。如果您需要两次,nodejs将通过引用返回完全相同的内容:

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

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

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

    我个人会选择第4个选项:

    将其存储在数据库中。数据库将数据加载到内存中以便更快地访问,并且它们是为处理大量文件而构建的。在处理JSON时,MongoDB是一个不错的选择:

    1
    2
    3
    4
    5
     const db = mongodb.collection("json");

     function getFile() {
        return db.findOne({"name":"test" });
     }


    所以我创建了一个大的JSON文件,并测量了时间,看看哪个文件更快,创建该文件的代码在末尾,并进行了注释。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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() {})
    */

    这是我机器上的结果:

    1
    2
    3
    method_1_sync : 131.861ms
    method_2      : 131.510ms
    method_1_async: 130.521ms

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