Подтвердить что ты не робот

Как Javascript/Node.js хранит двигатель JSON в памяти?

У меня есть файл JSON объемом 70 МБ, который я читал из Node.js script и назначал переменной.

console.log(process.memoryUsage());
let data=require('../newJSON.json');
console.log(process.memoryUsage());

Выход:

{ rss: 28184576,
  heapTotal: 6283264,
  heapUsed: 4199672,
  external: 8252 }
{ rss: 724721664,
  heapTotal: 695595008,
  heapUsed: 663708016,
  external: 8252 }

Кажется, что 70 МБ JSON занимает 632 МБ памяти. Мне интересно понять, как JSON хранится в памяти с помощью Node Js/Javascript?

4b9b3361

Ответ 1

Во-первых, JSON - это просто строковое представление объектов. Нет ничего особенного в "объектах JSON" - парсер JSON анализирует строку JSON и создает из нее обычные JavaScript-объекты. Это:

var a = JSON.parse('{"foo": "bar"}');

и это:

var a = new Object(); a.foo = "bar";

полностью эквивалентны.


Хранение объектов в памяти сложное, потому что современные JavaScript-движки имеют довольно отличную оптимизацию для разных разных обстоятельств в зависимости от того, что делает ваш код.

Длина строки JSON и размер соответствующего объекта в памяти строго не коррелированы; в большинстве случаев ожидается, что JSON будет меньше, иногда много. Например. для самого внутреннего вложения вашего примера: "a":0, занимает 6 байт, тогда как для еще одного свойства в созданном объекте вам нужно:

  • один указатель для имени свойства, "a"
  • один указатель атрибутов свойств (записываемый, перечислимый, настраиваемый)
  • один указатель для значения свойства, 0
  • Предполагая, что объект находится в режиме словаря: в среднем примерно два указателя слабины

На 64-битной платформе, которая добавляет до ~ 40 байт.

Если вы посмотрите на весь объект одинаковой формы: {"a":0,"b":1} - 13 символов, тогда как потребность в памяти:

  • Указатель "map"
  • "элементы" указатель (не используется)
  • указатель "свойства" вне объекта (не используется)
  • значение первого свойства (0)
  • значение второго свойства (1)
  • объект "карта": 11 указателей (могут использоваться совместно с другими объектами одинаковой формы, но если у вас есть только один такой объект, с ним ничего не поделиться)
  • дескрипторы свойств карты объектов: 10 указателей

Всего 26 указателей или 208 байт.

Наконец, есть вероятность, что некоторые из использования памяти вы видите из временных объектов, которые GC очистит с течением времени.