私は大きな 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 人のテスト環境にすぎません。