2013-08-30 3 views
5

Эта программа использует сокеты для передачи избыточных двумерных байтовых массивов (например, изображения). В то время как скорость передачи сравнительно высокая (10 Мбит/с), массивы также сильно избыточны (например, каждая строка может содержать несколько одинаковых значений). Я пробовал zlib и lz4, и результаты были многообещающими, однако я все же думаю о лучшем методе сжатия и, пожалуйста, помните, что он должен быть относительно быстрым, как в lz4. Какие-либо предложения?какой алгоритм сжатия используется для избыточных данных

+1

Вы отметили «сжатие изображения». Являются ли данные, которые вы сжимаете поток изображений? Если это так, я бы предложил либо использовать кодеки Lossless Video/Image. – Aron

+0

Данные не являются реальными изображениями, однако они отвечают всем требованиям, чтобы вести себя как изображения, и я взглянул на видеокодеки без потерь, однако данные генерируются в реальном времени, а видеокодеки, как правило, медленны в фазе сжатия. – beebee

+0

Попробуйте дать [этот документ] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf) читать. – jxh

ответ

1

вы можете создать свой собственный, если данные в строках аналогично можно создать ресурс/индекс карты, таким образом, уменьшая значительнее размер, что-то вроде этого

Оригинальный файл:
строка 1: 1212, 34, 45,1212,45,34,56,45,56
ряд 2: 34,45,1212,78,54,87, ....

Вы можете создать список уникальных значений, чем использовать и индекс на замену,

34,45,54,56,78,87,1212

строка 1: 6,0,2,6,1,0, .....

это может potantialy спасти вас более чем на 30% или более передачи данных, но это зависит от того, как избыточные данные

UPDATE

Вот простая реализация

std::set<int> uniqueValues 
DataTable my2dData; //assuming 2d vector implementation 
std::string indexMap; 
std::string fileCompressed = ""; 

int Find(int value){ 
    for(int i = 0; i < uniqueValues.size; ++i){ 
    if(uniqueValues[i] == value) return i; 
    } 
    return -1; 
} 

//create list of unique values 
for(int i = 0; i < my2dData.size; ++i){ 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    uniqueValues.insert(my2dData[i][j]); 
    } 
}  

//create indexes 
for(int i = 0; i < my2dData.size; ++i){ 
    std::string tmpRow = ""; 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    if(tmpRow == ""){ 
     tmpRow = Find(my2dData[i][j]);  
    } 
    else{ 
     tmpRow += "," + Find(my2dData[i][j]); 
    } 
    } 
    tmpRow += "\n\r"; 
    indexMap += tmpRow; 
} 

//create file to transfer 
for(int k = 0; k < uniqueValues.size; ++k){ 
    if(fileCompressed == ""){ 
     fileCompressed = "i: " + uniqueValues[k];  
    } 
    else{ 
     fileCompressed += "," + uniqueValues[k]; 
    } 
} 
fileCompressed += "\n\r\d:" + indexMap; 

теперь на приемном конце вы просто наоборот, если линия начинаются с «я», вы получаете индекс, если это начать с " d "вы получаете данные

+0

Спасибо Фабрицио. У меня есть что-то подобное в виду. Однако, прежде чем внедрять такой метод, я ищу стандартный алгоритм сжатия, предназначенный для избыточных (с конкретным шаблоном, как упомянуто) данных. – beebee

+0

Я думаю, что @Fabrizio прав, но я думаю, что zlib также вполне приемлемое решение вашей проблемы. Вам нужно найти баланс между высокой производительностью и высокой сложностью. – Netherwire

+1

библиотека, о которой вы упомянули, неплохо справляется с этим, но поскольку любая библиотека общего назначения реализована как «общая», которая может быть не лучшей для всех ситуаций, пример, который я вам предоставил, используется файлами данных .obj 3d формат, и не должен занять много времени для реализации и является тихим мощным http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

Перед сжатием следует посмотреть на PNG algorithms for filtering image data. Они представляют собой простые и более сложные методы прогнозирования значений в 2D-массиве на основе предыдущих значений. В той степени, в которой прогнозы хороши, фильтрация может значительно улучшить последующий шаг сжатия.

Вы должны просто попробовать эти фильтры на своих данных, а затем подать на lz4.

+0

Спасибо, Марк, я получил концепцию, и я думаю, что концепция соседних пикселей может быть расширена до более чем около 1 пиксельных соседей ... Я имею в виду наличие окон с расстоянием n пикселей во всех направлениях и то, возможно, используйте фильтр типа 3 ... – beebee

+0

, но все же я не уверен, как 1 найти n в разумные сроки и 2 - что делать с краями ... – beebee

+0

Для краев обрабатывайте его так, как если бы массив был окруженный нулями. –

Смежные вопросы