1

40.000 行の .xls スプレッドシートからインポートされたデータを印刷する次の静的メソッドがあります。

現在、コンソールにデータを出力するのに約 27 秒かかり、メモリ消費量が膨大です。

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            System.out.print(cell.toString());
            if (j < list.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("");
    }
}

免責事項:私は知っています、私は知っています、私は大きなデータがデータベースに属していることを知っています、コンソールに出力を出力しないでください、時期尚早の最適化はすべての悪の根源です...

4

2 に答える 2

2

各行を一度に1つずつ印刷するのではなく、StringBuilderを使用して大きな文字列を作成し、それを一度に印刷するか、または非常に多くの行を追加した後に印刷してみましたか?StringBuilderを一種のバッファーとして使用します。

例えば、

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    StringBuilder strBuilder = new StringBuilder();
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            // System.out.print(cell.toString());
            strBuilder.append(cell.toString());
            if (j < list.size() - 1) {
                // System.out.print(", ");
                strBuilder.append(", ");
            }
        }
        // System.out.println("");
        strBuilder.append("\n");

        // consider testing strBuilder size here and printing it out if
        // it is greater than some pre-set, then re-initializing the 
        // strBuilder variable.
    }
    System.out.println(strBuilder.toString());
}
于 2012-06-18T21:16:22.603 に答える
0

log4jを試してください。それはあなたのためにバッファリングします。また、スプレッドシート全体をメモリにロードする代わりに、代わりに読みながら印刷できますか?

于 2012-06-18T22:33:01.463 に答える