Оптимизация двоичной сериализации для многомерных универсальных массивов

Это называется Разрушение объектов . Требование возвращает объект, содержащий несколько ключей (включая ключи в вашем примере), и javascript ES6 + сделает каждый из этих ключей доступным в качестве прямой константы

Пример:

// object containing name, country & job keys
const person = {name: "John Doe", country: "Belgium", job: "Developer"};

// destructuring assignment, grabbing name, country & job from the person object
const {name, country, job} = person;

console.log(name);//"John Doe"
console.log(country);//"Belgium"
console.log(job);//"Developer"

Обратите внимание, что вы Можно также назначить другое имя переменной с похожим синтаксисом.
Учитывая предыдущий объект:

const {job: occupation} = person

console.log(occupation); //"Developer"

require в Node анализирует файл JavaScript и возвращает объект window.exports, который создается путем обертывания некоторого кода вокруг исходного JS. См. Что на самом деле требует () возврат файла, или функции и https://nodejs.org/api/modules.html#modules_require_id

Дополнительные ресурсы : Ресурс MDN

7
задан Blorgbeard 8 March 2017 в 02:50
поделиться

4 ответа

Вот то, что я придумал. Код ниже делает интервал [1000] [10000] и пишет этому использование BinaryFormatter в 2 файла - один заархивированный и один нет.

Заархивированный файл составляет 1,19 МБ Разархивированных (1 255 339 байтов), 38,2 МБ (40 150 034 байта)

        int width = 1000;
        int height = 10000;
        List<int[]> list = new List<int[]>();
        for (int i = 0; i < height; i++)
        {
            list.Add(Enumerable.Range(0, width).ToArray());
        }
        int[][] bazillionInts = list.ToArray();
        using (FileStream fsZ = new FileStream("c:\\temp_zipped.txt", FileMode.Create))
        using (FileStream fs = new FileStream("c:\\temp_notZipped.txt", FileMode.Create))
        using (GZipStream gz = new GZipStream(fsZ, CompressionMode.Compress))
        {
            BinaryFormatter f = new BinaryFormatter();
            f.Serialize(gz, bazillionInts);
            f.Serialize(fs, bazillionInts);
        }

Я не могу думать о лучшем / простом способе сделать это. Заархивированная версия довольно чертовски трудна.

Я пошел бы с BinaryFormatter + GZipStream. Создание чего-то пользовательского не было бы забавой вообще.


[редактирование MG] я надеюсь, что Вы не будете оскорблены редактированием, но универсальной формой, повторенный Диапазон (0, ширина) скашивает вещи значительно; изменение в:

        int width = 1000;
        int height = 10000;
        Random rand = new Random(123456);
        int[,] bazillionInts = new int[width, height];
        for(int i = 0 ; i < width;i++)
            for (int j = 0; j < height; j++)
            {
                bazillionInts[i, j] = rand.Next(50000);
            }

И попробуйте его;вот увидишь temp_notZipped.txt на уровне 40 МБ, temp_zipped.txt на уровне 62 МБ. Не настолько привлекательный...

5
ответ дан 7 December 2019 в 12:26
поделиться

Лучшая разрядность кода / выходное отношение размера состояла бы в том, чтобы закодировать Ваше использование массива BitConverter, преобразовав все элементы в их компактный двоичный формат. Это является ручным, я знаю, но оставлю 80-90% свободного места по сравнению с двоичной сериализацией.NET.

0
ответ дан 7 December 2019 в 12:26
поделиться

Можно ли определить "большой"? 1000x10000xint пример (другое сообщение) выходит на уровне 40 МБ; и 1000x10000x4 байта (=int) составляют 38 МБ. Когда издержки идут, который не ужасен.

Какие данные T, вероятно, будут? Просто примитивы? Я думаю, что мог, вероятно, отредактировать protobuf-сеть для поддержки прямоугольных антенных решеток* - но сохранять некоторую проводную совместимость нам, вероятно, был бы нужен заголовок (один байт) на элемент - т.е. 9 МБ издержек для 1000x10000 пример.

Это, вероятно, не стоит того для вещей как float, double, и т.д. (так как они хранятся дословно под "буферами протокола") - но могут быть сбережения для вещей как int просто из-за того, как это упаковывает ints... (особенно, если они имеют тенденцию быть на меньшей стороне [величина]). Наконец, если T является на самом деле объектами как Person и т.д. затем это должно быть намного лучше, чем двоичная сериализация, так как это очень хорошо в упаковке объектов.

Это не было бы тривиально к рожку для обуви в прямоугольных антенных решетках, но сообщило бы мне, является ли это чем-то, что Вы интересовались бы попыткой.

*: это не делает в данный момент, так как "буферная спецификация" протокола не поддерживает их, но мы можем бездельничать это...

0
ответ дан 7 December 2019 в 12:26
поделиться

Причина, по которой должно быть так много данных о типах, заключается в том, что ваш массив T может быть любого типа, но, более конкретно, T может иметь тип SomeBaseClass и вы все еще можете хранить SomeDerivedClass в этом массиве, и десериализатору необходимо это знать.

Но эти избыточные данные делают его хорошим кандидатом для сжатия, как отмечали другие.

0
ответ дан 7 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: