標籤:
問題背景:
我需要產生一個大概1.5T的double型矩陣,硬碟受不了,IO時間消耗不起,於是嘗試在輸出前壓縮。矩陣產生使用java,在矩陣上的計算使用cpp
於是分別嘗試使用java 寫gz壓縮檔和使用c++讀壓縮檔
一下為簡單的測試代碼:
寫:
public boolean generateGzipFile(String ofname) throws IOException { FileOutputStream fout = new FileOutputStream(ofname); GZIPOutputStream gos = new GZIPOutputStream(fout); for(int i = 0; i < numbers.size(); i++){ String tstr = String.valueOf(numbers.get(i)); tstr += "\n"; gos.write(tstr.getBytes()); } gos.finish(); gos.flush(); gos.close(); return true; }
讀:
#include <iostream>#include <stdlib.h>#include <string>#include <zlib.h>using namespace std;int main(int argc, char **argv){ if(argc != 2){ cerr << "example command: exe file.tar.gz" << endl; return 0; } gzFile gzfp = gzopen(argv[1], "rb"); if(!gzfp) return 0; char buf[32]; while(gzgets(gzfp, buf, 31)){ cout << "str: " << buf << endl; cout << "num: " << atof(buf) << endl; } return 0;}
需要注意的問題:
GZIPOutputStream只有一個write方法,只接受byte[],於是需要將double轉換成byte[],有兩條路:
1. double 直接轉化成byte[]
//byte dnum[] = new byte[8]; //ByteBuffer.wrap(dnum).putDouble(numbers.get(i)); //gos.write(dnum);
這種方法寫入的檔案,不能使用gunzip直接解壓,解壓會出亂碼,因為檔案儲存體double值是按照每個數位char作為一個位元組儲存的,只能自己寫解壓程式,將byte[]轉成double
2. double 轉String再轉byte[]
也就是我最終用的方法
最後,做了一些測試,gzip的壓縮效果真心點贊
-rw-r--r-- 1 users 193843 Apr 20 2015 t10e4
-rw-r--r-- 1 users 5408 Apr 20 2015 t10e4.gz
-rw-r--r-- 1 users 1977688 Apr 20 2015 t10e5
-rw-r--r-- 1 users 80940 Apr 20 2015 t10e5.gz
嘗試使用c++ gzlib和java GZIPOutputStream 讀寫gz壓縮檔