Сериализация
Если размер результата не должен быть таким маленьким, вы можете рассмотреть различные методы сериализации. Поскольку JSON является понятным для человека языком, это также не самый экономичный формат.
Например, для представления числа 1234.567890123457 потребуется 18 байт в строковом формате UTF-8 JSON. Однако двоичный формат может представлять то же число, что и 8-байтовое число с плавающей запятой. Точно так же false будет 5 байтов в JSON, но один байт (или, возможно, меньше) в двоичном формате. В зависимости от структуры данных может быть лучше использовать методы двоичной сериализации.
Некоторые из сериализаторов, которые вы можете попробовать, будут:
- CBOR
- Улыбка
- BSON
- MessagePack
- Ion (текстовые и двоичные форматы)
Это потребует дальнейшего тестирования, но вы сможете уменьшить размер легко уменьшается вдвое с помощью некоторых методов
Сжатие
Если вы все равно хотите сжать его, пожалуйста, примите во внимание, что сжатие сериализованных данных в большинстве случаев сводит на нет любые преимущества использования двоичный формат сериализации данных, конечный сжатый размер имеет очень мало общего с методом сериализации и почти все связано с методом сжатия. Выбор наилучшего алгоритма сжатия - это игра, балансирующая между стоимостью хранения данных и стоимостью сжатия данных, но вы можете выбрать правильный баланс в соответствии с ожидаемым жизненным циклом и шаблонами чтения.
Лично я использовал gzip, потому что он быстрый, дает эффективные результаты и изначально работает в JVM. Однако вы можете выбрать Brotli, я слышал, что он дает отличные результаты при сжатии статических c интерфейсных javascript ресурсов. Вы также можете попробовать XZ, Zstandard и bzip2.
В результате сжатия вы можете уменьшить размер данных в десять раз, однако загрузка 2 МБ каждый раз, когда клиент загружает страницу, может быть слишком большой
Пример сжатия
Например, используя brotli для предоставленных вами данных, мне удалось уменьшить размер данных до 3,4 МБ. Я уверен, что какая-то другая комбинация метода сжатия и сериализации может привести к уменьшению файла данных, но опять же, это может отрицательно повлиять на скорость сжатия / распаковки. Использование сжатия в nodejs с кодом, приведенным ниже:
const brotli = require('brotli');
const fs = require("fs");
const path = require("path");
const compressed = brotli.compress(fs.readFileSync(path.join(__dirname, "india.json")), {
mode: 0, // 0 = generic, 1 = text, 2 = font (WOFF2)
quality: 11, // 0 - 11
lgwin: 22 // window size
});
Мне потребовалось около 2 минут, чтобы полностью сжать, однако, поскольку он может быть предварительно сжат, это не имеет большого значения, что действительно важно, хотя скорость распаковки на стороне клиента, которая занимает менее одной секунды в той же среде, в которой произошло сжатие.
const data = brotli.decompress(fs.readFileSync("compressed.bin"));
fs.writeFileSync(__dirname + "/decoded.json", data);