1

私は大きな csv ファイルの処理に取り組んでおり、バッチ インポートに関する次の記事を見つけました: http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/。私も同じことをしようとしましたが、効果がないようです。

各フラッシュの後、データベースでインスタンスを表示できるようにする必要がありますか? 「SELECT COUNT(*) FROM TABLE1」をクエリしようとすると、エンティティが 0 またはすべて存在するため、インスタンスが一度にコミットされているように見えます。

次に、空のテーブルに初めてインポートするときはインポートがすばやく機能することにも気付きましたが、テーブルがいっぱいで、エンティティを更新または新規として保存する必要がある場合、プロセス全体が非常に遅くなります。これは主に、メモリがクリーンアップされずに 1MB 以下に減少し、アプリが動かなくなることが原因です。セッションをフラッシュしていないためですか?

インポートするための私のコードは次のとおりです。

public void saveAll(List<MedicalInstrument> listMedicalInstruments) {
    log.info("start saving")
    for (int i = 0; i < listMedicalInstruments.size() - 1; i++) {
        def medicalInstrument = listMedicalInstruments.get(i)
        def persistedMedicalInstrument = MedicalInstrument.findByCode(medicalInstrument.code)
        if (persistedMedicalInstrument) {
            persistedMedicalInstrument.properties = medicalInstrument.properties
            persistedMedicalInstrument.save()
        } else {
            medicalInstrument.save()
        }
        if ((i + 1) % 100 == 0) {
            cleanUpGorm()
            if ((i + 1) % 1000 == 0) {
                log.info("saved ${i} entities")
            }
        }
    }
    cleanUpGorm()
}

protected void cleanUpGorm() {
    log.info("cleanin GORM")
    def session = sessionFactory.currentSession
    session.flush()
    session.clear()
    propertyInstanceMap.get().clear()
}

助けてくれてありがとう!

よろしく、

ロイザ

PS: 私の JVM メモリは合計で 252.81 MB ありますが、これは私と他の 3 人のテスト環境にすぎません。

4

2 に答える 2

6

私はかつて同様の問題を抱えていました。その後、その理由は、デフォルトでトランザクション対応の grails サービスで実行していたためだと気付きました。したがって、サービス内のメソッドへのすべての呼び出しは、そのデータベースに変更を加えたトランザクションにラップされ、メソッドが完了するまで残ります。この場合、結果はフラッシュされません。

于 2012-11-13T10:05:51.580 に答える
0

私の経験から、それらはすべて最後にコミットされるまで、必ずしもデータベースに表示されるとは限りません。私はOracleを使用していますが、それらをバッチでコミットできるようにする唯一の方法(データベースで表示される)は、バッチごとに個別のトランザクションを作成し、フラッシュ後に閉じることです。ただし、最終フラッシュのプロセスの最後にエラーが発生しました。私にはそれを理解する時間がありませんでした.上記のプロセスを使用すると、データの負荷がどれほど大きくても問題は発生しませんでした.

この方法を使用すると、非常に役立ちます。実際にセッションをフラッシュしてクリアします。メモリ使用率を監視して、それを確認できます。

レコードでテーブルを更新する限り、テーブルにインデックスはありますか? データベースがインデックスを最新の状態に保とうとするため、このような大量の挿入/更新がインデックスによって遅くなることがあります。インポート/更新の前にインデックスを無効にしてから、完了したら有効にしますか?

于 2012-05-11T22:47:02.627 に答える