Bonjour,
Je souhaiterais conseils et point de vue concernant le chargement d'un fichier dont la taille avoisine 18 gigaoctets, contenant quasiment 41 millions d'articles, lesquels répondent à une structure de champs de longueur fixe.
Mon schéma s'enrichit d'une nouvelle table que je dois remplir à partir de ce fichier. Aucun problème pour créer et insérer la nouvelle table dans le projet, puis pour faire le mapping.
Le chargement initial par la méthode brutale - script SQL - dure près de 26 heures, Hibernate permet de le faire en moins de 4 heures.
Voici la méthode Java que j'ai faite permettant ce chargement :
L'idée est d'utiliser les méthodes flush et clear, cependant il y a une faille : le commit ne se fait qu'à la fin. Si jamais, pour une raison ou pour une autre, le chargement plante, la table n'est pas pour autant remplie et tout est perdu. Cela m'est arrivé ce matin... Près de 3 heures perdues pour rien. Mettre le commit dans le traitement de l'exception n'est pas forcément la bonne solution, j'y ai bien pensé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public static void chargerFIP(String nomFicIn) { long cpt = 0; Date d1 = new Date(); Log.info(sdf.format(d1) + "; debut chargerFip"); Log.info(sdf.format(d1) + "; " + nomFicIn); try { InputStream ips = new FileInputStream(nomFicIn); InputStreamReader ipsr = new InputStreamReader(ips); BufferedReader br = new BufferedReader(ipsr); String l; cpt = 1; while ((l = br.readLine()) != null) { ArticleId mId = new ArticleId (); mId.toArticle(l); Article m = new Article(mId); session.save(m); cpt ++; if (cpt % 50000 == 0) { session.flush(); session.clear(); Log.info(sdf.format(new Date()) + "; " + cpt + " éléments enregistrés"); } } tx.commit(); br.close(); ipsr.close(); ips.close(); } catch (Exception e) { Log.error(sdf.format(new Date()) + "; élément " + cpt + " : " + e.toString()); } Date d2 = new Date(); Log.info(sdf.format(d2) + "; fin chargerFip"); }
Alors je me suis penché sur la question : je fais des commit tous les 50000 articles, mais je dois réouvrir une session après chaque commit, avec des effets un peu bizarres, telle la base figée. J'ai cherché sur Internet de l'aide, mais je ne suis pas très bon en anglais... Ainsi je ne vois pas d'alternative à cela.
Ainsi, si quelqu'un pouvait me conseiller sur la façon de faire, je l'en remercie d'avance.
DomIII
Partager