0

私はJavaのリーダーを持っています:そして、リーダー(Reader read)は1'000.000行のファイルからのものです

そして、データベースに各行を保存する必要があります。リーダーを次のように読んでいます。

            int data = read.read();
            String line = "";


            while (data != -1) {
                char dataChar = (char) data;
                data = read.read();
                if (dataChar != '\n') {
                    line = line + dataChar;
                } else {
                    i++;
                    showline(line);
                    line = "";
                }
            }

次に、各行で DAO を呼び出しています。

private static void showline(String line) {
    try {
        if (line.startsWith(prefix)) {
            line = line.substring(prefix.length());
        }
        ms = new Msisdn(Long.parseLong(line, 10), idList);
        ListDAO.createMsisdn(ms);
    } catch (Exception e) {
    }
}

そして私のDAOは:

public static void createMsisdn(Msisdn msisdn) {
    EntityManager e = DBManager.createEM();
    try {
        createMsisdn(msisdn, e);
    } finally {
        if (e != null) {
            e.close();
        }
    }

}

public static void createMsisdn(Msisdn msisdn, EntityManager em) {

    em.getTransaction().begin();
    em.persist(msisdn);
    em.getTransaction().commit();

}

しかし、私の問題は、1'000.000 行のファイルを完了するのに約 1 時間 30 分かかることです。どうすれば速くなりますか?

(私の主な問題は、DAO を 1'000.000 回呼び出すことです。これは非常に遅いためです。while の方が高速であるため、DAO を呼び出さない場合の時間は 1 分未満ですが、DAO を呼び出すと時間は 2 になります。時間)

4

1 に答える 1

0

文字を読み取ってString1 つずつ追加するのは、非常に非効率的です。a を使用しBufferedReaderてテキスト行を読み取る方がはるかに優れています。

        String line;
        BufferedReader reader = new BufferedReader(read);
        while ((line = reader.readLine()) != null) {
            showline(line);
        }

ただし、これはあなたの場合には大きな影響はありません。各行を個別のトランザクションに挿入しているため、各トランザクションが完了するまでに数百ミリ秒かかる場合があります。1 つのトランザクションに複数の行を挿入できるようにコードを構成する必要があります。たとえば、次のように行のブロックを読み取ることができますが、一度に複数を受け入れて単一のバッチで処理するようにshowlinesandメソッドを変更する必要があります。createMsisdn

        final int TRANSACTION_SIZE = 500;
        int i = 0;
        String[] lines = new String[TRANSACTION_SIZE];
        BufferedReader reader = new BufferedReader(read);
        while ((lines[i] = reader.readLine()) != null) {
            if (i >= lines.length) { 
                showlines(lines, lines.length);
                i = 0;
            } else {
                i++;
            }
        }

        if (i > 0) showlines(lines, i);
于 2013-10-07T23:09:30.190 に答える