Как 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 будет очищать с течением времени.