2017-04-21 59 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