嘗試使用c++ gzlib和java GZIPOutputStream 讀寫gz壓縮檔

來源:互聯網
上載者:User

標籤:

問題背景:

我需要產生一個大概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壓縮檔

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.