이 프로그램은 소켓을 사용하여 고도로 이중화 된 2 차원 바이트 배열 (이미지)을 전송합니다. 전송 속도가 비교적 높은 (10Mbps) 동안, 어레이는 또한 매우 과잉이다 (예를 들어, 각 행은 몇몇 결과적으로 유사한 값을 포함 할 수있다). 나는 zlib과 lz4를 시도해 보았지만 그 결과는 유망했다. 그러나 나는 여전히 더 나은 압축 방법을 생각하고 있으며, lz4에서와 같이 상대적으로 빠르다는 것을 기억해야한다. 어떤 제안? 행의 데이터는 따라서 감소 자원/인덱스 맵을 만들 수 있습니다 비슷한 경우고도의 중복 데이터에 사용할 압축 알고리즘
답변
당신이 당신의 자신을 만들 수 상당한 크기,이
원본 파일과 같은 :
행 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, .....
이 30 % 이상 데이터 전송을 통해 당신을 저장할 potantialy 수 있지만, 데이터가
얼마나 중복에 따라 달라집니다여기 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 "를 얻는다. 데이터
Fabrizio에게 감사드립니다. 나는 비슷한 것을 염두에두고있다. 그러나 그런 방법을 구현하기 전에 중복 데이터 (언급 한 특정 패턴의 데이터)로 설계된 표준 압축 알고리즘을 찾고있다. – beebee
@Fabrizio가 맞다고 생각하지만, zlib도 문제의 수용 가능한 해결책이라고 생각합니다. 높은 성능과 높은 복잡성 사이의 균형점을 찾아야합니다. – Netherwire
당신이 언급 한 라이브러리는 꽤 훌륭하게 작동하지만 모든 범용 라이브러리가 모든 상황에서 최상이 아닌 "일반"으로 구현 되었기 때문에 내가 제공 한 예제는 .obj 3d 데이터 파일에서 사용됩니다 형식으로 구현하는 데 오랜 시간이 걸리지 않고 조용합니다. 강력한 http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock
압축하기 전에 PNG algorithms for filtering image data을 확인해야합니다. 이전 값을 기반으로 2D 배열의 값을 예측하기위한보다 정교한 방법에 간단합니다. 예측이 양호한 정도까지, 필터링은 후속 압축 단계에서 크게 개선 될 수 있습니다.
데이터에 이러한 필터를 사용해보고 lz4로 보내면됩니다.
"이미지 압축"이라는 태그가 지정되었습니다. 압축 된 데이터가 이미지 스트림입니까? 그렇다면 무손실 비디오/이미지 코덱을 사용할 것을 제안합니다. – Aron
데이터는 실제 이미지가 아니지만 이미지와 같이 작동하는 데 필요한 모든 요구 사항을 충족하며 무손실 비디오 코덱을 살펴 보았습니다. 그러나 실시간으로 생성되는 비디오 코덱은 압축 단계에서 느려지는 경향이 있습니다. – beebee
[이 신문] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf)을 읽어보십시오. – jxh