提交 7c1ae052 编写于 作者: T tickduan

sz.py test 190ms and 31M size

上级 3e24cb15
...@@ -17,31 +17,9 @@ ...@@ -17,31 +17,9 @@
void new_TightDataPointStorageD_Empty(TightDataPointStorageD **this) void new_TightDataPointStorageD_Empty(TightDataPointStorageD **this)
{ {
*this = (TightDataPointStorageD*)malloc(sizeof(TightDataPointStorageD)); TightDataPointStorageD* tdps = (TightDataPointStorageD*)malloc(sizeof(TightDataPointStorageD));
(*this)->dataSeriesLength = 0; memset(tdps, 0, sizeof(TightDataPointStorageD));
(*this)->allSameData = 0; *this = tdps;
(*this)->exactDataNum = 0;
(*this)->reservedValue = 0;
(*this)->reqLength = 0;
(*this)->radExpo = 0;
(*this)->leadNumArray = NULL; //its size is exactDataNum/4 (or exactDataNum/4+1)
(*this)->leadNumArray_size = 0;
(*this)->exactMidBytes = NULL;
(*this)->exactMidBytes_size = 0;
(*this)->residualMidBits = NULL;
(*this)->residualMidBits_size = 0;
(*this)->intervals = 0;
(*this)->isLossless = 0;
(*this)->segment_size = 0;
(*this)->raBytes = NULL;
(*this)->raBytes_size = 0;
} }
int new_TightDataPointStorageD_fromFlatBytes(TightDataPointStorageD **this, unsigned char* flatBytes, size_t flatBytesLength, sz_exedata* pde_exe, sz_params* pde_params) int new_TightDataPointStorageD_fromFlatBytes(TightDataPointStorageD **this, unsigned char* flatBytes, size_t flatBytesLength, sz_exedata* pde_exe, sz_params* pde_params)
......
...@@ -17,30 +17,9 @@ ...@@ -17,30 +17,9 @@
void new_TightDataPointStorageF_Empty(TightDataPointStorageF **this) void new_TightDataPointStorageF_Empty(TightDataPointStorageF **this)
{ {
*this = (TightDataPointStorageF*)malloc(sizeof(TightDataPointStorageF)); TightDataPointStorageF* tdpf = (TightDataPointStorageF*)malloc(sizeof(TightDataPointStorageF));
(*this)->dataSeriesLength = 0; memset(tdpf, 0, sizeof(TightDataPointStorageF));
(*this)->allSameData = 0; *this = tdpf;
(*this)->exactDataNum = 0;
(*this)->reservedValue = 0;
(*this)->reqLength = 0;
(*this)->radExpo = 0;
(*this)->leadNumArray = NULL; //its size is exactDataNum/4 (or exactDataNum/4+1)
(*this)->leadNumArray_size = 0;
(*this)->exactMidBytes = NULL;
(*this)->exactMidBytes_size = 0;
(*this)->residualMidBits = NULL;
(*this)->residualMidBits_size = 0;
(*this)->intervals = 0;
(*this)->isLossless = 0;
(*this)->segment_size = 0;
(*this)->raBytes = NULL;
(*this)->raBytes_size = 0;
} }
int new_TightDataPointStorageF_fromFlatBytes(TightDataPointStorageF **this, unsigned char* flatBytes, size_t flatBytesLength, sz_exedata* pde_exe, sz_params* pde_params) int new_TightDataPointStorageF_fromFlatBytes(TightDataPointStorageF **this, unsigned char* flatBytes, size_t flatBytesLength, sz_exedata* pde_exe, sz_params* pde_params)
......
...@@ -99,14 +99,13 @@ int SZ_ReadConf(const char* sz_cfgFile) { ...@@ -99,14 +99,13 @@ int SZ_ReadConf(const char* sz_cfgFile) {
{ {
dataEndianType = LITTLE_ENDIAN_DATA; dataEndianType = LITTLE_ENDIAN_DATA;
confparams_cpr->sol_ID = SZ; confparams_cpr->sol_ID = SZ;
confparams_cpr->max_quant_intervals = 500; confparams_cpr->max_quant_intervals = 800;
confparams_cpr->maxRangeRadius = confparams_cpr->max_quant_intervals/2; confparams_cpr->maxRangeRadius = confparams_cpr->max_quant_intervals/2;
confparams_cpr->quantization_intervals = 5000;
exe_params->intvCapacity = confparams_cpr->maxRangeRadius*2; exe_params->intvCapacity = confparams_cpr->maxRangeRadius*2;
exe_params->intvRadius = confparams_cpr->maxRangeRadius; exe_params->intvRadius = confparams_cpr->maxRangeRadius;
confparams_cpr->quantization_intervals = 0; confparams_cpr->quantization_intervals = 500;
exe_params->optQuantMode = 1; exe_params->optQuantMode = 1;
confparams_cpr->predThreshold = 0.99; confparams_cpr->predThreshold = 0.99;
confparams_cpr->sampleDistance = 100; confparams_cpr->sampleDistance = 100;
......
...@@ -95,7 +95,7 @@ double getRealPrecision_double(double valueRangeSize, int errBoundMode, double a ...@@ -95,7 +95,7 @@ double getRealPrecision_double(double valueRangeSize, int errBoundMode, double a
int state = SZ_SUCCESS; int state = SZ_SUCCESS;
double precision = 0; double precision = 0;
if(errBoundMode==SZ_ABS||errBoundMode==ABS_OR_PW_REL||errBoundMode==ABS_AND_PW_REL) if(errBoundMode==SZ_ABS||errBoundMode==ABS_OR_PW_REL||errBoundMode==ABS_AND_PW_REL)
precision = absErrBound; precision = absErrBound*0.00000001;
else if(errBoundMode==REL||errBoundMode==REL_OR_PW_REL||errBoundMode==REL_AND_PW_REL) else if(errBoundMode==REL||errBoundMode==REL_OR_PW_REL||errBoundMode==REL_AND_PW_REL)
precision = relBoundRatio*valueRangeSize; precision = relBoundRatio*valueRangeSize;
else if(errBoundMode==ABS_AND_REL) else if(errBoundMode==ABS_AND_REL)
......
...@@ -139,7 +139,7 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData, ...@@ -139,7 +139,7 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData,
// calc save byte length and bit lengths with reqLength // calc save byte length and bit lengths with reqLength
int reqBytesLength = reqLength/8; int reqBytesLength = reqLength/8;
int resiBitsLength = reqLength%8; int resiBitsLength = reqLength%8;
float last3CmprsData[3] = {0}; //float last3CmprsData[3] = {0};
FloatValueCompressElement *vce = (FloatValueCompressElement*)malloc(sizeof(FloatValueCompressElement)); FloatValueCompressElement *vce = (FloatValueCompressElement*)malloc(sizeof(FloatValueCompressElement));
LossyCompressionElement *lce = (LossyCompressionElement*)malloc(sizeof(LossyCompressionElement)); LossyCompressionElement *lce = (LossyCompressionElement*)malloc(sizeof(LossyCompressionElement));
...@@ -152,7 +152,7 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData, ...@@ -152,7 +152,7 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData,
memcpy(preDiffBytes, vce->curBytes, 4); memcpy(preDiffBytes, vce->curBytes, 4);
// lce to arrays // lce to arrays
addExactData(exactMidByteArray, exactLeadNumArray, resiBitArray, lce); addExactData(exactMidByteArray, exactLeadNumArray, resiBitArray, lce);
listAdd_float(last3CmprsData, vce->data); //listAdd_float(last3CmprsData, vce->data);
//add the second data //add the second data
type[1] = 0; type[1] = 0;
...@@ -160,12 +160,12 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData, ...@@ -160,12 +160,12 @@ TightDataPointStorageF* SZ_compress_float_1D_MDQ(float *oriData,
updateLossyCompElement_Float(vce->curBytes, preDiffBytes, reqBytesLength, resiBitsLength, lce); updateLossyCompElement_Float(vce->curBytes, preDiffBytes, reqBytesLength, resiBitsLength, lce);
memcpy(preDiffBytes, vce->curBytes, 4); memcpy(preDiffBytes, vce->curBytes, 4);
addExactData(exactMidByteArray, exactLeadNumArray, resiBitArray, lce); addExactData(exactMidByteArray, exactLeadNumArray, resiBitArray, lce);
listAdd_float(last3CmprsData, vce->data); //listAdd_float(last3CmprsData, vce->data);
int state; int state;
float checkRadius; float checkRadius;
float oriFloat; float oriFloat;
float pred = last3CmprsData[0]; float pred = vce->data;
float diff; float diff;
checkRadius = (quantization_intervals-1)*realPrecision; checkRadius = (quantization_intervals-1)*realPrecision;
float double_realpreci = 2*realPrecision; float double_realpreci = 2*realPrecision;
......
...@@ -26,7 +26,9 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte ...@@ -26,7 +26,9 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte
size_t targetUncompressSize = dataLength <<3; //i.e., *8 size_t targetUncompressSize = dataLength <<3; //i.e., *8
//tmpSize must be "much" smaller than dataLength //tmpSize must be "much" smaller than dataLength
size_t i, tmpSize = 12+MetaDataByteLength_double+exe_params->SZ_SIZE_TYPE; size_t i, tmpSize = 12+MetaDataByteLength_double+exe_params->SZ_SIZE_TYPE;
unsigned char* szTmpBytes; unsigned char* szTmpBytes = NULL;
bool needFree = false;
if(cmpSize!=12+4+MetaDataByteLength_double && cmpSize!=12+8+MetaDataByteLength_double) if(cmpSize!=12+4+MetaDataByteLength_double && cmpSize!=12+8+MetaDataByteLength_double)
{ {
pde_params->losslessCompressor = is_lossless_compressed_data(cmpBytes, cmpSize); pde_params->losslessCompressor = is_lossless_compressed_data(cmpBytes, cmpSize);
...@@ -44,20 +46,12 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte ...@@ -44,20 +46,12 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte
tmpSize = cmpSize; tmpSize = cmpSize;
szTmpBytes = cmpBytes; szTmpBytes = cmpBytes;
} }
else if(pde_params->szMode==SZ_BEST_COMPRESSION || pde_params->szMode==SZ_DEFAULT_COMPRESSION || pde_params->szMode==SZ_TEMPORAL_COMPRESSION) else
{ {
if(targetUncompressSize<MIN_ZLIB_DEC_ALLOMEM_BYTES) //Considering the minimum size if(targetUncompressSize<MIN_ZLIB_DEC_ALLOMEM_BYTES) //Considering the minimum size
targetUncompressSize = MIN_ZLIB_DEC_ALLOMEM_BYTES; targetUncompressSize = MIN_ZLIB_DEC_ALLOMEM_BYTES;
tmpSize = sz_lossless_decompress(pde_params->losslessCompressor, cmpBytes, (unsigned long)cmpSize, &szTmpBytes, (unsigned long)targetUncompressSize+4+MetaDataByteLength_double+exe_params->SZ_SIZE_TYPE); tmpSize = sz_lossless_decompress(pde_params->losslessCompressor, cmpBytes, (unsigned long)cmpSize, &szTmpBytes, (unsigned long)targetUncompressSize+4+MetaDataByteLength_double+exe_params->SZ_SIZE_TYPE);
//szTmpBytes = (unsigned char*)malloc(sizeof(unsigned char)*tmpSize); needFree = true;
//memcpy(szTmpBytes, tmpBytes, tmpSize);
//free(tmpBytes); //release useless memory
}
else
{
printf("Wrong value of pde_params->szMode in the double compressed bytes.\n");
status = SZ_MERR;
return status;
} }
} }
else else
...@@ -106,7 +100,7 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte ...@@ -106,7 +100,7 @@ int SZ_decompress_args_double(double* newData, size_t r1, unsigned char* cmpByte
} }
free_TightDataPointStorageD2(tdps); free_TightDataPointStorageD2(tdps);
if(pde_params->szMode!=SZ_BEST_SPEED && cmpSize!=12+MetaDataByteLength_double+exe_params->SZ_SIZE_TYPE) if(szTmpBytes && needFree)
free(szTmpBytes); free(szTmpBytes);
return status; return status;
} }
......
...@@ -34,7 +34,8 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes, ...@@ -34,7 +34,8 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes,
size_t targetUncompressSize = dataLength <<2; //i.e., *4 size_t targetUncompressSize = dataLength <<2; //i.e., *4
//tmpSize must be "much" smaller than dataLength //tmpSize must be "much" smaller than dataLength
size_t i, tmpSize = 8+MetaDataByteLength+pde_exe->SZ_SIZE_TYPE; size_t i, tmpSize = 8+MetaDataByteLength+pde_exe->SZ_SIZE_TYPE;
unsigned char* szTmpBytes; unsigned char* szTmpBytes = NULL;
bool needFree = false;
if(cmpSize!=8+4+MetaDataByteLength && cmpSize!=8+8+MetaDataByteLength) //4,8 means two posibilities of SZ_SIZE_TYPE if(cmpSize!=8+4+MetaDataByteLength && cmpSize!=8+8+MetaDataByteLength) //4,8 means two posibilities of SZ_SIZE_TYPE
{ {
...@@ -52,18 +53,12 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes, ...@@ -52,18 +53,12 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes,
tmpSize = cmpSize; tmpSize = cmpSize;
szTmpBytes = cmpBytes; szTmpBytes = cmpBytes;
} }
else if(pde_params->szMode==SZ_BEST_COMPRESSION || pde_params->szMode==SZ_DEFAULT_COMPRESSION || pde_params->szMode==SZ_TEMPORAL_COMPRESSION) else
{ {
if(targetUncompressSize<MIN_ZLIB_DEC_ALLOMEM_BYTES) //Considering the minimum size if(targetUncompressSize<MIN_ZLIB_DEC_ALLOMEM_BYTES) //Considering the minimum size
targetUncompressSize = MIN_ZLIB_DEC_ALLOMEM_BYTES; targetUncompressSize = MIN_ZLIB_DEC_ALLOMEM_BYTES;
tmpSize = sz_lossless_decompress(pde_params->losslessCompressor, cmpBytes, (unsigned long)cmpSize, &szTmpBytes, (unsigned long)targetUncompressSize+4+MetaDataByteLength+exe_params->SZ_SIZE_TYPE);// (unsigned long)targetUncompressSize+8: consider the total length under lossless compression mode is actually 3+4+1+targetUncompressSize tmpSize = sz_lossless_decompress(pde_params->losslessCompressor, cmpBytes, (unsigned long)cmpSize, &szTmpBytes, (unsigned long)targetUncompressSize+4+MetaDataByteLength+exe_params->SZ_SIZE_TYPE);// (unsigned long)targetUncompressSize+8: consider the total length under lossless compression mode is actually 3+4+1+targetUncompressSize
needFree = true;
}
else
{
printf("Wrong value of pde_params->szMode in the double compressed bytes.\n");
status = SZ_MERR;
return status;
} }
} }
else else
...@@ -111,7 +106,7 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes, ...@@ -111,7 +106,7 @@ int SZ_decompress_args_float(float* newData, size_t r1, unsigned char* cmpBytes,
//cost_end_(); //cost_end_();
//printf("totalCost_=%f\n", totalCost_); //printf("totalCost_=%f\n", totalCost_);
free_TightDataPointStorageF2(tdps); free_TightDataPointStorageF2(tdps);
if(pde_params->szMode!=SZ_BEST_SPEED && cmpSize!=8+MetaDataByteLength+exe_params->SZ_SIZE_TYPE) if(szTmpBytes && needFree)
free(szTmpBytes); free(szTmpBytes);
return status; return status;
} }
......
...@@ -120,33 +120,101 @@ float check_same(float* ft1, float* ft2, int count){ ...@@ -120,33 +120,101 @@ float check_same(float* ft1, float* ft2, int count){
return same_rate; return same_rate;
} }
double check_same_double(double* ft1, double* ft2, int count){
int same_cnt =0;
for(int i=0; i< count; i++){
if(ft1[i] == ft2[i]){
same_cnt ++;
}
if(i < 5){
printf(" i=%d ft1=%.40f diff=%.40f \n", i, ft1[i], ft1[i] - ft2[i]);
printf(" i=%d ft2=%.40f \n", i, ft2[i]);
}
}
double same_rate = same_cnt*100/count;
printf(" all count=%d same=%d same rate=%.0f%% \n", count, same_cnt, same_rate);
return same_rate;
}
// //
// test compress and decompress // test compress and decompress
// //
extern bool gOpenLossy; extern bool gOpenLossy;
bool testFile(const char* inFile, char algorithm){
// check valid
if(inFile == NULL || inFile[0] == 0 ){
printf(" inFile is NULL or EMPTY.\n");
return false;
}
int cnt = 0; bool DoDouble(double* doubles, int cnt, int algorithm) {
float* floats = read_float(inFile, &cnt); // compress
if(floats == NULL) { const char* input = (const char*)doubles;
return false; int input_len = cnt * sizeof(double);
char* output = (char*) malloc(input_len);
int output_len = input_len;
char* buff = (char*) malloc(input_len);
int buff_len = input_len;
cost_start();
int ret_len = 0;
if(algorithm == 2)
ret_len = tsCompressDouble(input, input_len, cnt, output, output_len, algorithm, buff, buff_len);
else
ret_len = tsCompressDoubleLossy(input, input_len, cnt, output, output_len, algorithm, buff, buff_len);
if(ret_len == -1) {
printf(" compress error.\n");
return 0;
} }
double use_ms1 = cost_end("compress");
printf(" compress len=%d input len=%d\n", ret_len, input_len);
double rate=100*(double)ret_len/(double)input_len;
printf(" compress rate=%.1f an-rate=%.4f%%\n", (double)input_len/(double)ret_len, rate);
//
// decompress
//
double* ft2 = (double*)malloc(input_len);
cost_start();
int code = 0;
if(algorithm == 2)
code = tsDecompressDouble(output, ret_len, cnt, (char*)ft2, input_len, algorithm, buff, buff_len);
else
code = tsDecompressDoubleLossy(output, ret_len, cnt, (char*)ft2, input_len, algorithm, buff, buff_len);
double use_ms2 = cost_end("Decompress");
printf(" Decompress return length=%d \n", code);
// compare same
double same_rate = check_same_double(doubles, ft2, cnt);
printf("\n ------------------ count:%d <%s> ---------------- \n", cnt, algorithm == 2?"TD":"SZ");
printf(" Compress Rate ......... [%.2f%%] \n", rate);
double speed1 = (cnt*sizeof(double)*1000/1024/1024)/use_ms1;
printf(" Compress Time ......... [%.4fms] speed=%.1f MB/s\n", use_ms1, speed1);
double speed2 = (cnt*sizeof(double)*1000/1024/1024)/use_ms2;
printf(" Decompress Time........ [%.4fms] speed=%.1f MB/s\n", use_ms2, speed2);
printf(" Same Rate ............. [%.0f%%] \n\n", same_rate);
// free
free(ft2);
free(buff);
free(output);
return true;
}
bool DoFloat(float* floats, int cnt, int algorithm) {
// compress // compress
const char* input = (const char*)floats; const char* input = (const char*)floats;
int input_len = cnt * sizeof(cnt); int input_len = cnt * sizeof(float);
char* output = (char*) malloc(input_len); char* output = (char*) malloc(input_len);
int output_len = input_len; int output_len = input_len;
char* buff = (char*) malloc(input_len); char* buff = (char*) malloc(input_len);
int buff_len = input_len; int buff_len = input_len;
printf(" file %s have count=%d \n", inFile, cnt);
cost_start(); cost_start();
int ret_len = 0; int ret_len = 0;
if(algorithm == 2) if(algorithm == 2)
...@@ -194,12 +262,31 @@ bool testFile(const char* inFile, char algorithm){ ...@@ -194,12 +262,31 @@ bool testFile(const char* inFile, char algorithm){
// free // free
free(ft2); free(ft2);
free(floats);
free(buff); free(buff);
free(output); free(output);
return true; return true;
} }
bool testFile(const char* inFile, char algorithm){
// check valid
if(inFile == NULL || inFile[0] == 0 ){
printf(" inFile is NULL or EMPTY.\n");
return false;
}
int cnt = 0;
float* floats = read_float(inFile, &cnt);
if(floats == NULL) {
return false;
}
DoFloat(floats, cnt, algorithm);
free(floats);
return true;
}
// //
// txt to binary file // txt to binary file
// //
...@@ -577,26 +664,27 @@ void unitTestFloat() { ...@@ -577,26 +664,27 @@ void unitTestFloat() {
} }
void modulePath(char *buf, int size) #define DB_CNT 500
{ void test_same_double(int algo){
char path[1024]; double ori = 3.1415926;
sprintf(path, "/proc/%d/exe", getpid());
readlink(path, buf, size); double doubles [DB_CNT];
char* pos = strrchr(buf, '/'); for(int i=0; i< DB_CNT; i++){
if(pos) doubles[i] = ori;
pos[1]=0; }
DoDouble(doubles, DB_CNT, algo);
} }
// //
// ----------------- main ---------------------- // ----------------- main ----------------------
// //
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
printf("welcome to use taospack tools v1.3\n"); printf("welcome to use taospack tools v1.3\n");
char szbuf[512];
modulePath(szbuf, 512);
printf(szbuf);
gOpenLossy = false; gOpenLossy = false;
tsLossyInit(); tsLossyInit();
// //
...@@ -626,6 +714,11 @@ int main(int argc, char *argv[]) { ...@@ -626,6 +714,11 @@ int main(int argc, char *argv[]) {
return 0; return 0;
} }
if(strcmp(argv[1], "-samed") == 0) {
test_same_double(atoi(argv[2]));
return 0;
}
if(algo == 0){ if(algo == 0){
printf(" no param -tone -tw \n"); printf(" no param -tone -tw \n");
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册