2013-04-24 175 views
4

在編寫lz4 csv到壓縮二進制文件轉換器(大量外匯交易數據csv)的過程中,希望減少我的小vps上的存儲/磁盤帶寬需求。 自包含的代碼來說明lz4壓縮C++示例

#include <string> 
#include <fstream> 
#include <iostream> 
#include "lz4.h" 

using namespace std; 

int main() 
{ 
char szString[] = "2013-01-07 00:00:04,0.98644,0.98676 2013-01-07 00:01:19,0.98654,0.98676 2013-01-07 00:01:38,0.98644,0.98696"; 
const char* pchSource = szString; 
int nInputSize = sizeof(szString); 

cout <<"- pchSource -" << endl << pchSource << endl; 
cout <<"nbytes = "<< nInputSize << endl << endl; 
ofstream source("pchSource.txt"); 
source << pchSource; 

int nbytesPassed = 0; 
int nMaxCompressedSize = LZ4_compressBound(nInputSize); 

char *pszDest = new char[nMaxCompressedSize]; 
nbytesPassed = LZ4_compress(pchSource, pszDest, nInputSize); 
cout <<"- pszDest Compressed-" << endl; 
cout <<"nbytesPassed = "<< nbytesPassed << endl; 
cout << pszDest << endl << endl; 
// pszDest garbage ? 

char *pszDestUnCompressed = new char[nInputSize]; 
LZ4_uncompress(pszDest, pszDestUnCompressed, nInputSize); 
cout <<"- pszDestUnCompressed -" << endl; 
cout <<"nbytesPassed = "<< nbytesPassed << endl; 
cout << pszDestUnCompressed << endl << endl; 
//pszDestUnCompressed is correct ? 

delete[] pszDestUnCompressed; 
pszDestUnCompressed = 0; 

// ok lets write compressed pszDest to pszDest.dat 
ofstream outCompressedFile("pszDest.dat",std::ofstream::binary); 
outCompressedFile.write (pszDest,nMaxCompressedSize); 

delete[] pszDest; 
pszDest = 0; 

//read it back in and try to uncompress it 
ifstream infile("pszDest.dat",std::ifstream::binary); 
infile.seekg (0,infile.end); 
int nCompressedInputSize = infile.tellg(); 
infile.seekg (0); 

char* buffer = new char[nCompressedInputSize]; 
infile.read (buffer,nCompressedInputSize); 
const char* pchbuffer = buffer; 

char* pszUnCompressedFile = new char[nInputSize]; 
nbytesPassed = LZ4_uncompress(pchbuffer, pszUnCompressedFile, nInputSize); 
cout <<"- pszUnCompressedFile -" << endl; 
cout <<"nbytesPassed = "<< nbytesPassed << endl; 
cout << pszUnCompressedFile << endl; 

//write uncompressed pszDest.dat to pszUnCompressedFile.txt 
ofstream outUncompressedSource("pszUnCompressedFile.txt"); 
outUncompressedSource << pszUnCompressedFile; 
// On my system 32bit ArchLinux 3.7.10-1 - gcc 4.7.2-4 
// file contains random Garbage 

delete[] buffer; 
buffer = 0; 

delete[] pszUnCompressedFile; 
pszUnCompressedFile = 0; 

return 0; 
} 


CONSOLE OUTPUT : 
- pchSource - 
2013-01-07 00:00:04,0.98644 ..... 
nbytes = 108 

- pszDest Compressed- 
nbytesPassed = 63 
�2013-01-07 00: 

- pszDestUnCompressed - 
nbytesPassed = 63 
2013-01-07 00:00:04,0.98644 ..... 

- pszUnCompressedFile - 
nbytesPassed = -17 
�W��W�-07 q 

Process returned 0 (0x0) execution time : 0.010 s 
Press ENTER to continue. 

我顯然失去了一些東西,除了形成一個包括在源樣本是否有任何-其他用途的例子嗎?

回答

8

所有現在的工作的感謝,這裏是一個任何人的代碼,有興趣的

#include <fstream> 
#include <iostream> 

#include "lz4.h" 

using namespace std; 

int main() 
{ 
char szSource[] = "2013-01-07 00:00:04,0.98644,0.98676 2013-01-07 00:01:19,0.98654,0.98676 2013-01-07 00:01:38,0.98644,0.98696"; 
int nInputSize = sizeof(szSource); 

// compress szSource into pchCompressed 
char* pchCompressed = new char[nInputSize]; 
int nCompressedSize = LZ4_compress((const char *)(&szSource), pchCompressed, nInputSize); 

// write pachCompressed to binary lz4.dat 
ofstream outBinaryFile("lz4.dat",ofstream::binary); 
outBinaryFile.write(pchCompressed, nCompressedSize); 
outBinaryFile.close(); 
delete[] pchCompressed; 
pchCompressed = 0; 

//read compressed binary file (assume we pass/encode nInputSize but don't know nCompressedSize) 
ifstream infCompressedBinaryFile("lz4.dat", ifstream::binary); 

//Get compressed file size for buffer 
infCompressedBinaryFile.seekg (0,infCompressedBinaryFile.end); 
int nCompressedInputSize = infCompressedBinaryFile.tellg(); 
infCompressedBinaryFile.clear(); 
infCompressedBinaryFile.seekg(0,ios::beg); 

//Read file into buffer 
char* pchCompressedInput = new char[nCompressedInputSize]; 
infCompressedBinaryFile.read(pchCompressedInput,nCompressedSize); 
infCompressedBinaryFile.close(); 

// Decompress buffer 
char* pchDeCompressed = new char[nInputSize]; //(nCompressedInputSize *2) +8 
LZ4_uncompress(pchCompressedInput, pchDeCompressed, nInputSize); 
delete[] pchCompressedInput; 
pchCompressedInput = 0; 

// write decompressed pachUnCompressed to 
ofstream outFile("lz4.txt"); 
outFile.write(pchDeCompressed, nInputSize); 
outFile.close(); 

delete[] pchDeCompressed; 
pchDeCompressed = 0; 

return 0; 
} 

我也在一個簡單的CLI csv到二進制I/O的例子here

+0

@swaybee評論,「如果有人使用上面的樣本,顯然,LZ4_uncompress()現在已被棄用,但您可以使用完全相同的語法調用LZ4_decompress_fast()函數。只需更換函數的名稱,它應該可以工作(我使用的代碼版本爲:120)。「 – drs 2014-07-24 18:24:23

+0

感謝您的高舉爲我節省了一些時間,並將其轉換爲新版本。 – ArchNemSyS 2015-06-07 14:35:08