Вопрос или проблема
Мне нужно хранить очень большие предустановленные массивы в файле 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
. Эти решения помогут вам избежать конфликтов с переносами строк и обеспечат надёжное сжатие данных. Применяйте их с умом, и вы сможете улучшить производительность вашего приложения без ущерба для читаемости или сложностей с обработкой кода.