這兩天為了公事的一個小需要寫了一個轉檔程式, 來源檔是以;分隔的純文字檔, 要轉成xls格式, 還有一個附帶需求是資料筆數每60000筆, 需寫成新的sheet或xls檔案。
google了一下了解可用的api有POI-HSSF 及 JExcel 兩種, 首先採用POI-HSSF寫好程式, 測試來源檔大小: 8168KB, 資料筆數:69697,使用System.currentTimeMillis()計算時間
產生xls檔案需要時間約: 21944ms,
其中執行workbook.write(outputstream) 的時間佔了約: 15907ms!!
因為每次要轉的檔案是400多個, 檔案大小從1MB到60多MB, 用POI-HSSF轉完這些檔案大概需要4個小時! 在R6竟然也要這麼久,比我的測試機Intel C2D e6300還慢,有點意外
改用JExcel重新寫過, 測試同上的檔案得到結果為: xls檔案約: 6452ms, workbook.write() : 約1915ms!!
很明顯的速度改善, 兩種code的複雜度差不多, 除了在aix轉檔用String.getBytes()轉碼, 沒有碰到預期外的問題。
ps. 1. server為R6, 8GB Ram, OS是AIX5.2, Jdk1.5
2. 轉大檔時會碰到outofmemory, 在執行的參數加上 -mx1024m就沒問題
3. 在轉測試檔時從windows工作管理員觀察, POI-HSSF轉檔大約會用到550MB的記憶體, JExcel大約180MB
4. JExcel轉出來的xls檔案比POI-HSSF大一點, 但檢查資料無誤, 原因不詳
5. 版本: HSSF-POI 3.0.2-FINAL-20080204, JExcel 2.6.8
6. 執行時的系統狀況都只有一個cpu的loading, 這隻程式應該很適合改成multi-thread來跑...等我有空...
沒有留言:
張貼留言