Лучший способ справиться с множеством целых - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть массив размером около 10-100 тыс. Дюймов, который мне нужно сохранить (максимально сжатый) и вернуть обратно в полный массив самым быстрым способом. Каков наилучший способ справиться с этим типом вещей на языке, как C #.

Ответы [ 4 ]

6 голосов
/ 06 февраля 2010

Это зависит от того, что вы подразумеваете под «максимально сжатым».

Вы можете использовать BinaryWriter для записи целых чисел в поток или использовать BitConverter.GetBytes, чтобы получить каждое целое как четыре байта как копию в большом массиве. Любой из них будет хранить каждый int без каких-либо дополнительных метаданных.

Если вы хотите, чтобы он был более сжатым, BinaryWriter имеет метод Write7BitEncodedInt, который записывает целые числа с небольшими значениями в меньшем количестве байтов. Вы также можете использовать класс GZipStream, чтобы попытаться дополнительно сжать данные, как только они будут упакованы в байтовый массив.

Как правило, чем меньше вы хотите, тем больше времени займет обработка. Чтобы получить баланс между скоростью и размером, который вы хотите, вам просто нужно провести некоторое тестирование.

2 голосов
/ 06 февраля 2010

Ответ на ваш конкретный вопрос

  1. Выберите тип данных, который достаточно большой и только достаточно большой для хранения ваших данных - например, uint32_t или int64_t. Примечание: имеет фиксированной длины.
  2. Запись данных в двоичном виде - вплотную - в файл.
  3. Считайте данные обратно в память вашего типа массива.

Задача решена наиболее оптимальным способом. Если вам нужно сжатие на диске, пропустите данные через zip-библиотеку. сжатие данных в памяти, когда вы пытаетесь их использовать, как правило, нет-нет (общее решение использует другие методы). Укажите, если вам нужна информация, почему это нет-нет.

Общий ответ для вычислений с большими наборами данных

Специализированные математические библиотеки решают эти проблемы (например, октава или matlab), в частности, проблемы обработки большего числа чисел, чем вы можете себе представить на своем компьютере.

Эти библиотеки имеют механизм исполнения и определенный язык, но вы часто можете программно взаимодействовать с ними.

2 голосов
/ 06 февраля 2010

100 000 дюймов не так уж и много, зачем вам это нужно так сильно сжимать?

2 голосов
/ 06 февраля 2010

В зависимости от характера значений в этом массиве int, кодирование длины серии может быть другим вариантом. То есть, если все смежные ячейки в вашем массиве имеют одно и то же значение, вам нужно только сохранить первое вхождение значения в этой последовательности вместе с тем, сколько раз оно будет повторяться после этого. Это может особенно хорошо работать с «разреженными» данными.

...