2017-04-21 58 views
0

上下文:我正在使用Apache POI庫以某種格式讀取Excel文件。每個文件只有一張紙和一個特定的模板。我能夠讀取表單,對這些值執行一些操作,將它們存儲爲POJO,然後使用JAXB實現將它們轉換爲XML。Java - POI - 性能

問題:現在我只讀了幾個excel文件(比如說100),但我想設計我的應用程序的方式是,它的編號爲,可擴展的足以讀取1000到10000個文件。 你可以建議一個相同的好建築。另外,我應該使用多線程(比如一個10線程的線程池)來一次讀取10個表格,或者考慮到每張表單都有獨立的數據,而不是與任何其他表單鏈接的事實,這會是一個糟糕的設計。

注意: 我不能共享任何代碼片段,因爲這是專有代碼,儘管爲了假設,我們可以假設每個工作表有50行,每行有6到10列,全部爲純文本數據細胞。 由於文件很小,我將整個文件加載到內存中,然後進行處理。另外,我使用apache poi代碼遍歷行和列(示例如下)

XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream); 
sheet = workbook.getSheetAt(0); 
//outer for loop using 'i' to iterate all rows 
    row = sheet.getRow(i); 
    //inner for loop using 'j' to iterate all columns in a row 
     value = row.getCell(j) 
     //use 'value' as and when required 
    //end inner for loop 
//end outer for loop 

p.S.這是我的第一個問題,所以請隨時提出我的問題的任何改變/改進。

感謝和問候, 希德

+1

好吧,我們必須知道你究竟是如何讀取數據的。您可以更改代碼以模擬您如何讀取數據(不應該是專有的問題) – XtremeBaumer

+0

由於它們不相互關聯,所以非常適合並行處理。 –

+0

@XtremeBaumer添加了一個片段。請看看它是否有幫助。 – phoenixSid

回答

0

如果要並行處理很多事情,你可能要改變到SAX在POI解析,我們做的是數量級提高性能(我們有非常大的文件儘管開始)。

你說你正在加載文件到內存中,爲了提高性能,你應該考慮使用SSD而不是HDD,如果它是很多的I/O。 (如果你不能將它全部放在RAM中)

此外,線程池大小應該將其作爲餘量:Number of processor core vs the size of a thread pool

你可以考慮將它更管道的方法(這取決於你的代碼的結構),所以你做這樣的事情:

excelFiles.parallelStream().map(read).map(mainpulate).map(store).map(convert) 

如果你在擠過濾器某處或者如果事情返回空就可以減少在懶惰的方式更容易加載。

只是一些想法,YMMV。

+0

感謝您的想法!然而,我正在尋找類圖中的軟件體系結構,這在他的場景中會很好。而且,jaxb比通過sax手動解析所有東西容易得多。 – phoenixSid