-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Optimierung von Batch Import
PostPosted: Fri Aug 22, 2008 4:19 am 
Newbie

Joined: Fri Aug 22, 2008 4:00 am
Posts: 1
Hallo,

ich habe ein Programm geschrieben dass mir aus mehreren Input-Files Objekte erstellt und diese in die DB schreibt. Das funktioniert soweit, ist aber ziemlich langsam.

Das Problem ist wohl dass Erzeugen der Relationen zwischen den Klassen. Vereinfacht habe ich zwei Klassen (K1 und K2) die in einer one-to-many Relation gemappt sind. Im ersten Schritt erzeuge ich alle K1 Objekte und schreibe sie in die DB. Im 2. Schritt erzeuge ich alle K2 Objekte. Fuer jedes K2 muss ich ein K1 aus der Datenbank laden und in K2 einfuegen.
Das alles in folgenden Groessenordnungen: ca. 50000 x K1 und 200000 x K2. D.h. ich muss auch 200000 x ein K1 laden.

Waehrend der Import von K1 6min braucht, habe ich den Import von K2 nach 12h abgebrochen.

Kennt ihr irgendwelche best-practices um solche Imports zu machen?

Gruesse, Moritz


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 23, 2008 2:52 pm 
Beginner
Beginner

Joined: Thu Jul 24, 2008 3:33 am
Posts: 20
Ich schreibe gerade an einem ähnlichen Programm und hatte die Laufzeit von ein paar Tagen auf 6h runter gebracht. Dabei hatte ich in der ersten Version folgende Fehler drin, heisst aber nicht, dass du die auch hast, nur als Anregung. Ich verwende Spring und Hibernate.

Ein Fehler war in der Transaktionslogik, dadurch wurden für jedes Statement eine eigene Session aufgemacht. Jetzt verwende ich eine Session für den gesamten Import mit mehreren Transaktionen. Die Session ist der First Level Cache, daher hatte ich defacto in der ersten Version keinen Cache.

Ich hatte einen Fehler im Mapping, wodurch zu viel gelesen wurde. Es reicht wahrscheinlich, wenn du für K1 alle zugehörigen K2 ermitteln kannst und must nicht die ungekehrte Richtung auch noch unterstützen.

Als ich die ganzen unnötigen Statements weg hatte und nur noch inserts hatte, habe ich dann Batch-Insert aktiviert.

Ein Vorteil bei meinen Dateien ist, dass die K2-Datei(en) nach K1 sortiert sind, d.h. obwohl ich nach 100 importierten Datensätzen die Session flush'e und clear'e, zerstört dies den Effekt des Caches nicht.

Die Statements siehst du, wenn du
- bei log4j die Zeile log4j.logger.org.hibernate.SQL=DEBUG einfügst oder
- in deiner Hibernate.cfg die property "show_sql" auf true setzt, dabei schadet "hibernate.format_sql" auch nicht.

Die Transaktionen und Sessions habe ich bei Spring mit
Code:
log4j.logger.org.springframework.orm.hibernate3.SessionFactoryUtils=DEBUG
log4j.logger.org.springframework.orm.hibernate3.HibernateTransactionManager=DEBUG
log4j.logger.org.springframework.transaction.support.AbstractPlatformTransactionManager=DEBUG
bekommen.

Hoffe, das hilft.
Gruss, Christian


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.