* "Эффективный" здесь в основном означает меньший размер (чтобы уменьшить время ожидания ввода-вывода) и быстрое время поиска/десериализации. Время хранения не так важно.
Мне нужно хранить несколько десятков массивов целых чисел, каждый из которых имеет 1800 значений в диапазоне 0-50, в браузере localStorage, то есть в виде строки.
Очевидно, что самый простой метод - это просто JSON.stringify
он, однако, добавляет много ненужной информации, учитывая, что диапазоны данных хорошо известны. Средний размер для одного из этих массивов составляет ~ 5500 байт.
Вот некоторые другие методы, которые я пытался (результирующий размер и время для десериализации его 1000 раз в конце)
-
нулевое заполнение чисел, поэтому каждый из них имеет длину 2 символа, например:
[5, 27, 7, 38] ==> "05270738"
-
base 50, кодирующий его:
[5, 11, 7, 38] ==> "5b7C"
-
просто используя значение в качестве символьного кода (добавив 32, чтобы избежать появления в начале странных управляющих символов):
[5, 11, 7, 38] ==> "%+'F" (String.fromCharCode(37), String.fromCharCode(43) ...)
Вот мои результаты:
size Chrome 18 Firefox 11
-------------------------------------------------
JSON.stringify 5286 60ms 99ms
zero-padded 3600 354ms 703ms
base 50 1800 315ms 400ms
charCodes 1800 21ms 178ms
Мой вопрос в том, есть ли еще лучший метод, который я еще не рассматривал?
Обновление
MDΓΓBDLL предложил использовать сжатие данных. Сочетание этой реализации LZW с данными базы 50 и charCode. Я также тестировал код арофа (упаковывая 4 целых числа в 3 байта). Я получил следующие результаты:
size Chrome 18 Firefox 11
-------------------------------------------------
LZW base 50 1103 494ms 999ms
LZW charCodes 1103 194ms 882ms
bitpacking 1350 2395ms 331ms