Наиболее эффективный способ хранения больших массивов целых чисел в localStorage с помощью Javascript

*«Эффективность» здесь в основном означает меньший размер (, сокращение времени ожидания ввода-вывода)и быстрое время извлечения/десериализации. Время хранения не так важно.

Мне нужно сохранить пару десятков массивов целых чисел, каждый из которых содержит 1800 значений в диапазоне 0-50, в локальном хранилище браузера --, то есть в виде строки.

Очевидно, что самый простой способ — это просто 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

Мой вопрос в том, есть ли еще лучший метод, который у меня есть еще не рассматривал?

Обновление
MДΓΓБДLL предложил использовать сжатие данных. Объединение этой реализации 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
13
задан Community 23 May 2017 в 11:58
поделиться