2012-12-16 47 views
1

我使用字符串緩衝區和字節數組創建兩個CSV文件。
我使用ZipOutputStream來生成zip文件。每個csv文件將有14個列的20K記錄。實際上記錄是從數據庫中提取並存儲在ArrayList中。我必須迭代列表並構建StringBuffer並將StringBuffer轉換爲byte數組以將其註冊到zip條目。JVM用於創建CSV文件並對其進行壓縮的內存

我想知道 JVM需要的內存做了整個過程,從存儲ArrayList中的記錄開始。
我已經提供了下面的代碼片段。

StringBuffer responseBuffer = new StringBuffer(); 
    String response = new String(); 
    response = "Hello, sdksad, sfksdfjk, World, Date, ask, askdl, sdkldfkl, skldkl, sdfklklgf, sdlksldklk, dfkjsk, dsfjksj, dsjfkj, sdfjkdsfj\n"; 
    for(int i=0;i<20000;i++){ 
     responseBuffer.append(response); 
    } 
    response = responseBuffer.toString(); 
    byte[] responseArray = response.getBytes(); 
    res.setContentType("application/zip"); 
    ZipOutputStream zout = new ZipOutputStream(res.getOutputStream()); 
    ZipEntry parentEntry = new ZipEntry("parent.csv"); 
    zout.putNextEntry(parentEntry); 
    zout.write(responseArray); 
    zout.closeEntry(); 
    ZipEntry childEntry = new ZipEntry("child.csv"); 
    zout.putNextEntry(childEntry); 
    zout.write(responseArray); 
    zout.closeEntry(); 
    zout.close(); 

請幫我這個。提前致謝。

+0

做這個操作時你遇到了'OutOfMemoryError'嗎? –

+0

將其增加到一個龐大的數字,然後運行應用程序並監視到底分配了什麼 – Randy

+0

該應用程序將用於許多用戶。當多個用戶訪問應用程序時,我期待OutOfMemoryError。所以我想知道每個用戶的大約內存使用情況。 – Rumesh

回答

2

我猜你已經試着計算將有多少字節分配給StringBuffer和字節數組。但問題在於,除非CSV記錄的大小有上限,否則您無法真正瞭解應用程序將使用多少內存。我是如果你希望你的軟件穩定,健壯和可擴展,恐怕你問的是一個錯誤的問題:你應該努力執行你需要做的任務,使用固定數量的內存,在你的情況下看起來很容易。

關鍵是,在你的情況下,處理完全是FIFO - 你從數據庫中讀取記錄,然後將它們(以相同的順序)寫入FIFO流(在這種情況下爲OutputStream)。即使zip壓縮是基於流的,並在內部使用固定的內存量,所以你在這裏完全安全。除了將整個輸入緩衝在一個巨大的字符串中,然後將其轉換爲一個巨大的字節數組,然後將其寫入輸出流 - 您應該從數據庫中分別讀取每個響應元素(或固定大小的塊,比如說一次記錄100條記錄),並將其寫入輸出流。像

res.setContentType("application/zip"); 
ZipOutputStream zout = new ZipOutputStream(res.getOutputStream()); 
ZipEntry parentEntry = new ZipEntry("parent.csv"); 
zout.putNextEntry(parentEntry); 
while (... fetch entries ...) 
    zout.write(...data...) 
zout.closeEntry(); 

這種方法的優點的東西是因爲它與小塊運作的,你可以很容易地估計它們的大小,併爲您的JVM分配足夠的內存,以便它永遠不會崩潰。而且你知道,如果你的CSV文件將來會超過20K行,它仍然可以工作。

+0

是的...我試圖計算大小!感謝您的建議...... – Rumesh

2

要分析內存使用情況,您可以使用Profiler

JProfilerYourKit非常擅長這樣做。

VisualVM也有一定程度的好處。

0

您可以使用MemoryTestbench來測量內存。

http://www.javaspecialists.eu/archive/Issue029.html

本文desribes做什麼。它簡單,並且精確到1字節,我經常使用它。
它甚至可以從junit測試用例運行,所以它非常有用,而探查器無法從junit測試用例運行 。

使用該應用程序,您甚至可以測量一個Integer對象的內存大小。

但是用拉鍊有一件特別的事情。 Zipstream使用本地c庫,在這種情況下,MemoryTestbench可能不會測量那個內存,只有java部分。
您應該嘗試兩種變體,MemroyTestbench和分析器(jprof)。

相關問題