C++ 对于高度冗余的数据使用什么压缩算法

C++ 对于高度冗余的数据使用什么压缩算法,c++,compression,image-compression,C++,Compression,Image Compression,该程序使用套接字传输高度冗余的2D字节数组(类似于图像)。虽然传输速率相对较高(10 Mbps),但阵列也是高度冗余的(例如,每行可能包含多个类似值)。 我试过zlib和lz4,结果很有希望,但是我仍然想到了一种更好的压缩方法,请记住,它应该和lz4一样快。有什么建议吗?您可以创建自己的,如果行中的数据相似,您可以创建一个资源/索引映射,从而大大减小大小,类似这样 原始文件: 第1行:1212,34,451212,45,34,56,45,56 第2行:34,451212,78,54,87 您可以

该程序使用套接字传输高度冗余的2D字节数组(类似于图像)。虽然传输速率相对较高(10 Mbps),但阵列也是高度冗余的(例如,每行可能包含多个类似值)。
我试过zlib和lz4,结果很有希望,但是我仍然想到了一种更好的压缩方法,请记住,它应该和lz4一样快。有什么建议吗?

您可以创建自己的,如果行中的数据相似,您可以创建一个资源/索引映射,从而大大减小大小,类似这样

原始文件:
第1行:1212,34,451212,45,34,56,45,56
第2行:34,451212,78,54,87

您可以创建一个唯一值列表,而不是在替换中使用和索引

34,45,54,56,78,871212

第1行:6,0,2,6,1,0

这可能会为您节省30%或更多的数据传输,但这取决于数据的冗余程度

更新

这里是一个简单的实现

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;
std::设置唯一值
数据表my2dData//假设2d矢量实现
std::字符串索引映射;
std::string fileCompressed=“”;
int Find(int值){
对于(int i=0;i
现在,在接收端,您只需执行相反的操作,如果行以“i”开头,您将获得索引,如果它以“d”开头,您将获得数据

您应该在压缩之前查看数据。它们是简单到更复杂的方法,用于根据以前的值预测二维数组中的值。如果预测是好的,过滤可以在随后的压缩步骤中做出显著的改进


您只需在数据上尝试这些过滤器,然后将其提供给lz4。

您已经标记了“图像压缩”。您正在压缩的数据是图像流吗?如果是这样的话,我建议您使用无损视频/图像编解码器。数据不是真实图像,但它们满足像图像一样表现的所有要求。我已经查看了无损视频编解码器,但是数据是实时生成的,视频编解码器在压缩阶段往往很慢。请尝试读取。感谢jxh,我复习了论文。我不知道这和这个问题到底有什么关系。谢谢法布里齐奥。我也有类似的想法,但是,在实现这种方法之前,我正在寻找一种标准的压缩算法,该算法是为冗余数据设计的(具有前面提到的特定模式)。我认为@Fabrizio是正确的,但我想zlib也是一种可以接受的解决方案。您需要在高性能和高复杂性之间找到平衡点。您提到的库在这方面做得很好,但由于任何通用库都是“通用”的,这可能不是所有情况下都最好的,因此我向您提供的示例由.obj 3d数据文件格式使用,不需要很长时间就能实现,而且非常强大,谢谢Mark,我得到了这个概念,我认为邻域像素的概念可以扩展到比周围1像素邻域更大的范围…我正在考虑在所有方向上有一个距离为n像素的窗口,然后可能使用3型过滤器…但我仍然不确定如何1-在合理的时间内找到n,2-如何处理边缘…对于边缘,将其视为数组被零包围。从距离1过滤器开始,在尝试使用更多以前的数据之前,先查看距离1过滤器的距离。一般来说,当你看得更远时,你会得到递减的回报,甚至更糟糕的压缩。我会试试看,谢谢你的建议标记。