Как Javascript / Узел.JS engine хранит JSON в памяти?

у меня есть файл JSON 70 MB, который я читаю с узла.JS скрипт и назначить переменной.

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 MB JSON занимает 632 MB памяти. Мне интересно понять, как JSON хранится в памяти узлом Js / Javascript?

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
  • предполагая, что объект находится в режиме словаря: в среднем примерно два указателя slack

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

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

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

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

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