2016-02-08 165 views
0

我有一個文件,以.zip格式提供,我想將其讀入內存。壓縮大約50 MB,解壓縮大約700 MB。現在我想知道如果我應該先解壓縮文件然後再讀取它,或者它沒有任何區別,我可以直接從zip文件中讀取數據。將壓縮文件和解壓縮文件讀取到內存中

在正常文件的情況下,我使用圍繞FileInputStreamInputStreamReader
對於zip文件,我使用java.util.ZipFileZipEntry獲取InputStream,然後再圍繞它包裝InputStreamReader
所以最後我在兩種情況下都與InputStreamReader一起工作。

我試圖測試它,但本地我無法讀取這樣一個大文件而不會耗盡內存。在進程運行的服務器上有更多的進程干擾,所以我無法確定是否有任何區別。

有沒有人知道,如果其中一個選項使用的內存明顯多於另一個,那麼它只是一個設計問題,使用哪種方式?

問候, 烏韋

+0

你對解壓縮數據做什麼?該zipfile有多少條目? – wero

+0

這是您自己機器上的一次性工作,而不是生產工作上的常規工作嗎? –

+0

我們確實需要知道您需要如何處理數據。您可以在讀取時對其進行過濾,只需要在內存中保存一個小緩衝區和結果 - 或者您可以找到在磁盤上處理它的方法。應始終避免把它全部留在記憶中 - 除非這是一次性的。 –

回答

0

唯一的區別是解壓文件小的性能損失。在這兩種情況下,您的InputStreamReader將讀取解壓後的700 MB文件。

你應該問的下一個問題是爲什麼你需要將這個大文件完全讀入內存?它真的有必要嗎?也許你可以逐行處理它,而不用在內存中保存所有行。

+0

謝謝你的迴應。很高興聽到我的期望正朝着正確的方向前進。我很樂意爲這種情況使用流和lambas,但是隨着我們的架構的發展,現在這是不可能的。看到我對我的問題的評論。 – uBreckner

+0

爲了減少內存消耗,您可以兩次處理文件。在第1遍中,您只將組列的值存儲在像「Map >'這樣的地圖中。這些值是包含組列中的鍵的每行的文件位置。所以用這個你創建一個窮人的索引。在第二遍中,您可以遍歷地圖,並可以一起讀取一組組值的所有行。你需要一個'RandomAccessFile'來將文件指針定位到行首。 – vanje