对高度冗余的数据使用什么压缩算法
what compression algorithm to use for highly redundant data
此程序使用套接字传输高度冗余的2D字节数组(类似图像)。虽然传输速率相对较高(10Mbps),但阵列也是高度冗余的(例如,每行可以包含几个因此相似的值)。我尝试过zlib和lz4,结果很有希望,但我仍然认为有一种更好的压缩方法,请记住,它应该像lz4中那样相对快速。有什么建议吗?
在压缩之前,您应该了解用于过滤图像数据的PNG算法。它们是基于先前值预测2D阵列中的值的简单到更复杂的方法。在预测良好的程度上,滤波可以在随后的压缩步骤中做出显著的改进。
您只需在数据上尝试这些过滤器,然后将其提供给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,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 += "nr";
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 += "nrd:" + indexMap;
现在在接收端,你只需要做相反的事情,如果这行以"i"开头,你就会得到索引,如果它以"d"开头,那么你就会得到数据
相关文章:
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 找到对称矩阵的最大元素的最有效算法是什么
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- O(NlogN)算法运行速度快于O(n)..等等,什么
- 是什么让这种易失性打破了结构的指针算法?
- 这种快速排序算法有什么问题?
- 不确定我的排序算法出了什么问题
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- cv::absdiff() 使用什么方法/算法
- shake_transform_iterator作为推力中的第二个参数的重点是什么:: dredion算法
- 用于大型数据流的通货紧缩压缩算法
- 压缩算法(例如gzip、zip或snappy)的输出肯定小于输入吗
- 对高度冗余的数据使用什么压缩算法
- 整数字符串压缩算法
- 压缩2D曲线的最佳数据结构/算法是什么?
- 目前有什么C/ c++库充满了众所周知的压缩算法吗?
- 什么方法/算法/库可以安全地加密然后解密
- 关于图像压缩算法的混淆
- 带有检查点的开源压缩算法