2017-04-21 12 views
0

コンテキスト:Apache POIライブラリを使用して、特定の形式のExcelファイルを読んでいます。各ファイルには1枚のシートと特定のテンプレートしかありません。私はシートを読んだり、値を操作したり、POJOとして保存したり、JAXBの実装を使ってXMLに変換したりすることができます。Java - POI - パフォーマンス

問題:私は現在、いくつかのExcelファイル(たとえば100個)しか読んでいませんが、という1000〜10000個のファイルを読むのに十分な程度にアプリケーションを設計したいと考えていました。 あなたは同じアーキテクチャのための良いアーキテクチャを提案できますか?また、私は一度に10枚を読むためにマルチスレッド(スレッド10スレッドプール)を使用する必要がありますか、それは他のシートと相互にリンクされていない別のデータを持っているという事実を考慮すると悪い設計になります。

注:私は、私有コードであるため、任意のコードスニペットを共有することはできませんが、各シートに50行があり、各行に6から10列のプレーンテキストデータ細胞。 ファイルが小さいので、ファイル全体をメモリにロードしてから処理しています。また、私は、行と列(下のサンプル)

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.を反復処理するためのApache POIのコードを使用していますこれは私の最初の質問ですので、私の質問に変更や改善を提案してください。あなたはPOIで解析するSAXに変更する場合があります並行して多くのことを処理したい場合は、我々は(我々は非常に大きなファイルを持っていたことをやって桁違いにパフォーマンスを高め

おかげで、よろしく、 シド

+1

データを正確に読み取る方法を知っておく必要があります。データをどのように読み込むかをシミュレートするコードを変更することができます(独自のものでは問題ではありません)。 – XtremeBaumer

+0

これらは相互にリンクされていないので、並列処理に非常に適しています。 –

+0

@XtremeBaumerスニペットを追加しました。それが役立つかどうか確認してください。 – phoenixSid

答えて

0

しかし、始めて)。

パフォーマンスを向上させるためにファイルをメモリにロードしているとします.I/Oが多い場合は、HDDではなくSSDを使用することを検討する必要があります。 (RAMにすべて収まらない場合)

また、スレッドプールサイズはcosideration:Number of processor core vs the size of a thread poolになります。

あなたはそれ(あなたのコードは構造化されている方法に応じて)より多くのパイプラインアプローチすることを検討可能性がありますので、ような何か:あなたはどこかでフィルタを絞るか何かが空を返す場合は、減らすことができれば

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

を怠惰なアプローチでは負荷がより簡単になります。

ちょっとしたアイデア、YMMV。

+0

あなたのアイデアをありがとう!しかし、私は彼のシナリオでは良いクラス図nのようなソフトウェアアーキテクチャを探しています。また、jaxbは、サックスを使用して手動ですべてを解析するよりもはるかに簡単です。 – phoenixSid