IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

XML trop gros en mémoire : un moyen d'alléger ?


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 90
    Par défaut XML trop gros en mémoire : un moyen d'alléger ?
    Bonjour à tous,

    J'ai une appli qui papote avec une base de données PostgreSQL via JDBC et qui fait plein de 'select' sur cette base pour construire un fichier xml récapitulatif. Tout est en contenu en mémoire puisque le fichier est uniquement constitué de balises imbriquées.
    J'appelle ensuite un XMLOutputter et je lui demande un prettyformat.


    Tout fonctionne très bien sur une base moyenne. Mais dès que la base est très grande, je passe d'un temps de quelques minutes à plusieurs heures ....

    Le processus le plus long est à mon avis se fait au niveau de tous les selects qui, à cause du principe récursif, conserve tout en mémoire et donc c'est extrêmement lourd à supporter pour la machine. Sans compter le XML qui une fois écrit fait plusieurs centaines de mega et donc en mémoire ne facilite pas le tout.

    Est ce que quelqu'un aurait une vague idée sur un moyen d'alléger le process


    Merci beaucoup,

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par rednik Voir le message
    Tout est en contenu en mémoire puisque le fichier est uniquement constitué de balises imbriquées.
    Il n'y a pas de cause à effet. Tu pourrais écrire ton fichier XML au fur et à mesure, sans le conserver en mémoire. Il faut simplement ajouter une pile dans laquelle tu conserves les balises ouvertes. A la fin de l'écriture du fichier, tu dépiles les balises de la pile et tu écris les balises fermantes correspondantes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 90
    Par défaut
    Il est vrai que c'est ce qui semble le plus logique mais du coup on ne 'manipule' plus aucune donnée XML (Adieu prettyPrinter ), c'est à dire qu'on écrit dans un fichier de la même façon que n'importe quel autre avec une comptabilisation des espaces dans chaque recursion et tout ?

    C'est ça que tu voulais dire dinobogan ou j'ai mal compris ?

    Merci

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par rednik Voir le message
    C'est ça que tu voulais dire dinobogan où j'ai mal compris ?
    Oui, c'est exactement ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 90
    Par défaut
    Bonjour à tous,

    Bon en fait ça ne change pas grand chose... Le fichier met toujours 6h à être généré (180Mo). J'ai cependant gagné une demi heure !

    Voici ma fonction principale de génération . Si quelqu'un a une idée sur une quelconque amélioration, je suis super preneuse !


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    	private static void writeTableXML(Table table, 
    			String whereRequest)
    	throws SQLException
    	{
    		// Execute Select Query on current table	
    		if (table == null)
    			return;
                    ResultSet row = executeQuery(table.buildCommand(whereRequest));
    		if (row == null || !row.next())
    			{
    				return;
    			}
    		do
    		{
    			// Write new line with name <tableName>
    			beforeWritingTable(table);
     
    			Iterator<Column> columnit = table.getIteratorOnColumns();
    			//Iterator on each column to add a new element 
    			while (columnit.hasNext())
    			{
    			   Column column = columnit.next();
    			    // If column name is a related table, recursive call
    			  if (column.isTable()
    			  {
    				for (Iterator<String> _itTable = column.getRelatedTable(); _itTable.hasNext() ; )
    		           writeTableXML(getRelatedTable(_itTable.next()), column.getCommand(row));	
    				}
    				// Column is only a value
    				else if (row != null)
    				{
    					String value = row.getString(column.getName());
    					if (value != null)
    					{		
    						writeElement(column.getName(), value);
    					}
    				}
    				// Column with no corresponding value is not written.
    				else if (row == null)
    				break;					
    			}
    			afterWritingTable(table.getName());
    		}
    		while (row != null && row.next());
    		if (row !=  null)
    			row.close();
    	}
    Merci,

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il nous manque plein de chose pour t'aider par exemple qu'est-ce que l'objet Table, et aussi le code des diverses méthodes.
    Pour savoir ce qui prend le plus de temps, calcul le temps d'exécution des différentes parties de ton algo. Cherche d'où vient la contention.Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long time = System.currenttimemillis();
    ...la partie à chronométrer...
    time = System.currenttimemillis() - time;
    System.out.println( "execution : " + time + " ms" );
    Puis tente différentes techniques pour récupérer les données en base puisque c'est manifestement là le soucis. Essais par exemple les PrepareStatement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. impossible d'utiliser un xml trop gros
    Par lizard2k3 dans le forum Flex
    Réponses: 2
    Dernier message: 13/08/2008, 13h11
  2. [JDOM] Fichier XML trop gros
    Par Mygush dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 06/07/2007, 12h17
  3. Fichier texte trop gros pour etre ouvert
    Par tavman dans le forum C++
    Réponses: 5
    Dernier message: 05/10/2005, 00h07
  4. ResultSet trop gros : OutOfMemoryException
    Par samsam05 dans le forum JDBC
    Réponses: 4
    Dernier message: 03/05/2005, 11h34
  5. pb avec les résultats trops gros
    Par nisaes dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/01/2005, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo