Как мне преодолеть сжатую строку lzw, которая вызывает проблемы в js-файле? [закрыто]

Вопрос или проблема

Мне нужно хранить очень большие предустановленные массивы в файле JavaScript. Каждый массив должен быть сжат отдельно, и файл JavaScript должен быть как можно меньше. Один из этих массивов должен распаковываться очень быстро во время выполнения (когда пользователь выбирает, какой массив нужен).

Проблема в том, что Visual Studio Code жалуется на окончания строк и их неправильное окончание. Это связано с сжатием LZW.

Сжатие необходимо, потому что оригинальный массив составляет около 600 КБ, строка JSON – около 30 КБ, а окончательная сжатая строка – всего 14 КБ.

Я не хочу использовать базу данных, так как вызов и возврат для этого сами по себе приведут к заметным задержкам при выполнении этого массива. Это должно быть быстро (это критично для программы).

Итак, я использовал JSON, чтобы преобразовать массив в строку. Затем я использовал сжатие LZW для сжатия этой строки. Эта строка (и другие строки аналогично сжатых массивов) затем помещаются в файл JavaScript.

(ПРИМЕЧАНИЕ: В приведенном ниже коде массив является всего лишь небольшой частью реального массива, который примерно в 32 раза больше.)

function lzw_encode(s) {
    let i, dict = {}, data = (s + "").split(""),
        out = [], currChar, phrase = data[0], code = 256;
    for (i = 1, len = data.length; i < len; i++) {
        currChar = data[i];
        if (dict[phrase + currChar] != null) {
            phrase += currChar;
        }
        else {
            out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
            dict[phrase + currChar] = code;
            code++;
            phrase = currChar;
        }
    }
    out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
    for (i = 0, len = out.length; i < len; i++) {
        out[i] = String.fromCharCode(out[i]);
    }
    return out.join("");
}

let a = [
  [
    [
      [
        [
          [
            770,
            784,
            795,
          ],
          [
            804,
            816,
            830,
          ],
          [
            770,
            784,
            795,
          ],
        ],
        [
          [
            672,
            695,
            721,
          ],
          [
            738,
            750,
            761,
          ],
          [
            672,
            695,
            721,
          ],
        ],
      ],
      [
        [
          [
            672,
            695,
            721,
          ],
          [
            738,
            750,
            761,
          ],
          [
            672,
            695,
            721,
          ],
        ],
        [
          [
            555,
            572,
            592,
          ],
          [
            606,
            626,
            649,
          ],
          [
            555,
            572,
            592,
          ],
        ],
      ],
      [
        [
          [
            744,
            755,
            764,
          ],
          [
            770,
            784,
            795,
          ],
          [
            744,
            755,
            764,
          ],
        ],
        [
          [
            612,
            635,
            655,
          ],
          [
            672,
            695,
            721,
          ],
          [
            612,
            635,
            655,
          ],
        ],
      ],
    ],
    [
      [
        [
          [
            655,
            678,
            704,
          ],
          [
            655,
            678,
            704,
          ],
          [
            738,
            750,
            761,
          ],
        ],
        [
          [
            540,
            560,
            577,
          ],
          [
            540,
            560,
            577,
          ],
          [
            606,
            626,
            649,
          ],
        ],
      ],
      [
        [
          [
            540,
            560,
            577,
          ],
          [
            540,
            560,
            577,
          ],
          [
            606,
            626,
            649,
          ],
        ],
        [
          [
            454,
            468,
            480,
          ],
          [
            454,
            468,
            480,
          ],
          [
            503,
            520,
            534,
          ],
        ],
      ],
      [
        [
          [
            598,
            618,
            641,
          ],
          [
            598,
            618,
            641,
          ],
          [
            672,
            695,
            721,
          ],
        ],
        [
          [
            497,
            514,
            529,
          ],
          [
            497,
            514,
            529,
          ],
          [
            555,
            572,
            592,
          ],
        ],
      ],
    ],
  ],
  [
    [
      [
        [
          [
            638,
            652,
            663,
          ],
          [
            672,
            684,
            698,
          ],
          [
            638,
            652,
            663,
          ],
        ],
        [
          [
            540,
            563,
            589,
          ],
          [
            606,
            618,
            629,
          ],
          [
            540,
            563,
            589,
          ],
        ],
      ],
      [
        [
          [
            540,
            563,
            589,
          ],
          [
            606,
            618,
            629,
          ],
          [
            540,
            563,
            589,
          ],
        ],
        [
          [
            423,
            440,
            460,
          ],
          [
            474,
            494,
            517,
          ],
          [
            423,
            440,
            460,
          ],
        ],
      ],
      [
        [
          [
            612,
            623,
            632,
          ],
          [
            638,
            652,
            663,
          ],
          [
            612,
            623,
            632,
          ],
        ],
        [
          [
            480,
            503,
            523,
          ],
          [
            540,
            563,
            589,
          ],
          [
            480,
            503,
            523,
          ],
        ],
      ],
    ],
    [
      [
        [
          [
            523,
            546,
            572,
          ],
          [
            523,
            546,
            572,
          ],
          [
            606,
            618,
            629,
          ],
        ],
        [
          [
            408,
            428,
            445,
          ],
          [
            408,
            428,
            445,
          ],
          [
            474,
            494,
            517,
          ],
        ],
      ],
      [
        [
          [
            408,
            428,
            445,
          ],
          [
            408,
            428,
            445,
          ],
          [
            474,
            494,
            517,
          ],
        ],
        [
          [
            322,
            336,
            348,
          ],
          [
            322,
            336,
            348,
          ],
          [
            371,
            388,
            402,
          ],
        ],
      ],
      [
        [
          [
            466,
            486,
            509,
          ],
          [
            466,
            486,
            509,
          ],
          [
            540,
            563,
            589,
          ],
        ],
        [
          [
            365,
            382,
            397,
          ],
          [
            365,
            382,
            397,
          ],
          [
            423,
            440,
            460,
          ],
        ],
      ],
    ],
  ],
  [
    [
      [
        [
          [
            551,
            565,
            576,
          ],
          [
            585,
            597,
            611,
          ],
          [
            551,
            565,
            576,
          ],
        ],
        [
          [
            496,
            505,
            513,
          ],
          [
            522,
            531,
            542,
          ],
          [
            496,
            505,
            513,
          ],
        ],
      ],
      [
        [
          [
            496,
            505,
            513,
          ],
          [
            522,
            531,
            542,
          ],
          [
            496,
            505,
            513,
          ],
        ],
        [
          [
            456,
            462,
            467,
          ],
          [
            473,
            482,
            487,
          ],
          [
            456,
            462,
            467,
          ],
        ],
      ],
      [
        [
          [
            525,
            536,
            545,
          ],
          [
            551,
            565,
            576,
          ],
          [
            525,
            536,
            545,
          ],
        ],
        [
          [
            476,
            485,
            490,
          ],
          [
            496,
            505,
            513,
          ],
          [
            476,
            485,
            490,
          ],
        ],
      ],
    ],
    [
      [
        [
          [
            490,
            499,
            508,
          ],
          [
            490,
            499,
            508,
          ],
          [
            522,
            531,
            542,
          ],
        ],
        [
          [
            450,
            456,
            465,
          ],
          [
            450,
            456,
            465,
          ],
          [
            473,
            482,
            487,
          ],
        ],
      ],
      [
        [
          [
            450,
            456,
            465,
          ],
          [
            450,
            456,
            465,
          ],
          [
            473,
            482,
            487,
          ],
        ],
        [
          [
            419,
            424,
            430,
          ],
          [
            419,
            424,
            430,
          ],
          [
            439,
            444,
            450,
          ],
        ],
      ],
      [
        [
          [
            470,
            479,
            485,
          ],
          [
            470,
            479,
            485,
          ],
          [
            496,
            505,
            513,
          ],
        ],
        [
          [
            436,
            442,
            447,
          ],
          [
            436,
            442,
            447,
          ],
          [
            456,
            462,
            467,
          ],
        ],
      ],
    ],
  ],
  [
    [
      [
        [
          [
            462,
            476,
            487,
          ],
          [
            496,
            508,
            522,
          ],
          [
            462,
            476,
            487,
          ],
        ],
        [
          [
            407,
            416,
            424,
          ],
          [
            433,
            442,
            453,
          ],
          [
            407,
            416,
            424,
          ],
        ],
      ],
      [
        [
          [
            407,
            416,
            424,
          ],
          [
            433,
            442,
            453,
          ],
          [
            407,
            416,
            424,
          ],
        ],
        [
          [
            367,
            373,
            378,
          ],
          [
            384,
            393,
            398,
          ],
          [
            367,
            373,
            378,
          ],
        ],
      ],
      [
        [
          [
            436,
            447,
            456,
          ],
          [
            462,
            476,
            487,
          ],
          [
            436,
            447,
            456,
          ],
        ],
        [
          [
            387,
            396,
            401,
          ],
          [
            407,
            416,
            424,
          ],
          [
            387,
            396,
            401,
          ],
        ],
      ],
    ],
    [
      [
        [
          [
            401,
            410,
            419,
          ],
          [
            401,
            410,
            419,
          ],
          [
            433,
            442,
            453,
          ],
        ],
        [
          [
            361,
            367,
            376,
          ],
          [
            361,
            367,
            376,
          ],
          [
            384,
            393,
            398,
          ],
        ],
      ],
      [
        [
          [
            361,
            367,
            376,
          ],
          [
            361,
            367,
            376,
          ],
          [
            384,
            393,
            398,
          ],
        ],
        [
          [
            330,
            335,
            341,
          ],
          [
            330,
            335,
            341,
          ],
          [
            350,
            355,
            361,
          ],
        ],
      ],
      [
        [
          [
            381,
            390,
            396,
          ],
          [
            381,
            390,
            396,
          ],
          [
            407,
            416,
            424,
          ],
        ],
        [
          [
            347,
            353,
            358,
          ],
          [
            347,
            353,
            358,
          ],
          [
            367,
            373,
            378,
          ],
        ],
      ],
    ],
  ],
];
let str = JSON.stringify(a);
let strComp = lzw_encode(str);
document.getElementById("lab").innerHTML = strComp;
<label id="lab"></label>

Сжатая строка, начинающаяся с “[Āā770,784Ć95],….” является настоящим результатом. Я затем распаковываю это во время выполнения, когда массив запрашивается, выполняя обратное. Все это БЫСТРО, поэтому это делает то, что должно.

Похоже, это работает в производстве, поэтому это не серьезная проблема.

НО, есть ли другое БЫСТРОЕ сжатие и распаковка, которые не создают проблем с окончаниями строк и т.д.?

Я написал свое собственное только с использованием стандартного набора символов, но оно было значительно медленнее и не сжимало так сильно.

Ответ или решение

Для решения проблемы, связанной с обработкой sжатой строки, вызванной использованием алгоритма LZW в JavaScript-файле, необходимо предпринять несколько шагов. Основной проблемой, которую вы испытываете, является некорректное отображение перевода строки и символов в вашем коде, что создаёт трудности для Visual Studio Code. Давайте рассмотрим возможные решения и альтернативные методы сжатия.

1. Проблемы с LZW сжатием

Атрибуты, такие как переносы строк и специальные символы, могут привести к неверной интерпретации строки, которая была сжата с помощью алгоритма LZW. Это происходит из-за того, что сжатие создаёт непечатаемые символы или символы за пределами стандартной ASCII-таблицы, которые могут не поддерживаться в вашем редакторе кода и создать конфликты.

2. Альтернативные алгоритмы сжатия

Если вы ищете быстрое и эффективное сжатие, которое будет обходиться без ограничений, связанных с LZW, рассмотрите использование следующих алгоритмов:

a. Gzip или Deflate

Эти алгоритмы обеспечивают высокое сжатие и широко используются в веб-разработке. Вы можете воспользоваться библиотеками, такими как pako, для реализации сжатия и распаковки данных на стороне клиента:

// Установка pako: npm install pako
import pako from 'pako';

function compress(input) {
    const buffer = pako.deflate(input);
    return String.fromCharCode.apply(null, buffer);
}

function decompress(input) {
    const buffer = new Uint8Array(input.split('').map(char => char.charCodeAt(0)));
    const inflated = pako.inflate(buffer, { to: 'string' });
    return inflated;
}

let a = [...] // ваши данные
let str = JSON.stringify(a);
let compressedStr = compress(str);
document.getElementById("lab").innerHTML = compressedStr;

b. LZ-String

LZ-String — это библиотека, специально разработанная для сжатия строк, что делает её идеальным выбором для JavaScript. Она требует меньше обработок по сравнению с LZW и предоставляет более стабильные строки:

// Установка LZ-String: npm install lz-string
import LZString from 'lz-string';

let str = JSON.stringify(a);
let compressedStr = LZString.compressToUTF16(str);
document.getElementById("lab").innerHTML = compressedStr;

// Распаковка
let decompressedStr = LZString.decompressFromUTF16(compressedStr);
let array = JSON.parse(decompressedStr);

3. Обработка проблем с кодировкой

Обратите внимание, что для всех методов сжатия, которые используются, достаточно важно корректно обработать кодировку строк. Вам необходимо следить за тем, чтобы передаваемые данные были корректно интегрированы с использованием подходящих форматов, чтобы избежать возникновения проблем в редакторах кода и в процессе работы программы.

Заключение

Для быстрого и эффективного сжатия строк в JavaScript, которое не приводит к проблемам с символами управления в кода, рекомендуется переходить на использование библиотек, таких как pako или LZ-String. Эти решения помогут вам избежать конфликтов с переносами строк и обеспечат надёжное сжатие данных. Применяйте их с умом, и вы сможете улучшить производительность вашего приложения без ущерба для читаемости или сложностей с обработкой кода.

Оцените материал
Добавить комментарий

Капча загружается...