Эффективный способ прочитать файл JSON? - PullRequest
0 голосов
/ 23 января 2019

Я видел другой способ чтения файлов JSON из локального узла в Nodejs. как это;

  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-запроса Как извлечь данные из файла JSON, используя Jquery и ajax?

Могут быть и другие способы. Но я слышал, что чтение файла JSON с помощью метода 1 более эффективно, чем другие методы.

Я разрабатываю модуль, в котором мне нужно читать файл JSON, когда каждый запрос на стороне клиента и я в настоящее время использую метод 1. Это банковское приложение, и производительность имеет значение. так помогите мне найти какой путь лучше использовать этот senario?

Спасибо, любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Метод 3) не рассматривается, так как он объединяет один из других методов с сетевым запросом, поэтому вам все равно придется выбрать один из других методов.

Я предполагаю, что метод 2) вызывает утечку памяти,NodeJS вернет точно то же самое по ссылке, если вам потребуется это дважды:

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

, поэтому, если вам потребуется что-то один раз, оно останется в памяти навсегда.Это быстро, если вы просматриваете его несколько раз, но если у вас есть много файлов, он заполнит память.

Теперь остался только метод 1), и я бы пошел с асинхронной версией,поскольку он может выполнять несколько запросов параллельно, что превзойдет метод синхронизации, если ваш сервер находится под нагрузкой.


Лично я бы выбрал вариант 4):

Сохраните его вбаза данных.Базы данных загружают данные в память для более быстрого доступа, и они были созданы для обработки большого количества файлов.Поскольку вы имеете дело с JSON, Mongodb будет хорошим выбором:

 const db = mongodb.collection("json");

 function getFile() {
    return db.findOne({ "name": "test" });
 }
0 голосов
/ 23 января 2019

поэтому я создал большой файл 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 не стоит тестировать из-за задержки в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...