2012-11-06 78 views
2

我必須從zip文件中讀取包含超過100000個文件的文件,並且我使用的是Java 1.6,因此我暫時使用Apache commons compress庫。但是,ZipFile()的構造函數需要大約30秒才能返回。 (我承認我的機器已經過時了,C2D E6550有8GB內存,但如果zip文件少於65535個文件,構造函數幾乎立即返回)ZipFile的構造函數在Java/Apache Commons中壓縮zip64文件壓縮

現在我需要加速它,因爲我們的程序非常頻繁地打開zip文件,ZipFile構造函數花費的時間太長了。我有兩個選擇: 1)拆分壓縮文件到每個卷與< 65535文件 或 2)高速緩存的ZipFile對象和重用

然而,無論是需要重構的顯著量/修改,只有這樣我纔去上無論是解決方案,有沒有辦法加快閱讀與不同的庫zipfile文件,或者我做錯了Apache公共壓縮?這是我如何創建zipfile對象:

final File f = new File(zipFileName); 
if(f.exists() == false) 
    throw new FileNotFoundException(zipFileName); 
ZipFile zip = new ZipFile(f); 

有關如何解決此問題的任何想法?

回答

1

從查看source code,它打開zipfile並立即讀取所有條目。它將這些信息存儲在內部的hashmaps中,這些內部hashmaps的大小並不適合您的用例。所有的重新討論都可能成爲問題。但很難確定。您應該使用分析器執行它以查看時間花在哪裏。

您也可以獲取apache commons的源代碼,並製作自己的版本,以允許您控制初始大小以查看是否有幫助。

如果沒有,您可以始終在單獨的線程中構造此對象,並在構建時使用其他有用的東西。

+1

按照你的建議,改變了hashmap的初始大小,運行profiler來檢查構造函數完成所花費的時間。它將時間縮短了一半,但仍然超過我們的預算。我想我將不得不硬着頭皮在我的代碼中進行一些重構。 – Yenchi

+0

如果您能夠將散列表更改爲樹形圖。你也可以總是使用zip unix命令,但htat可能會「違反規則」。 – Sam

+0

@sam謝謝你建議的樹形圖。但是,通過爲地圖指定預定義大小(例如100000),創建地圖的時間不再是瓶頸。這是另一個功能,它掃描整個zip文件的中心目錄。但鑑於它必須掃描100000條記錄,很難指望它很快完成。 – Yenchi