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

API standards et tierces Java Discussion :

mapping mémoire, serialization et socket


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut mapping mémoire, serialization et socket
    bonjour à tous,

    voilà, mon problème concerne l'envoi de gros fichiers via un Socket.

    actuellement je lit le fichier local et je mets ça dans un byte[] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public static byte[] read (File filePath) throws IOException {
    		InputStream is = new BufferedInputStream(new FileInputStream(filePath));
    		byte[] bytesArray = new byte[(int) filePath.length()];
     
    		is.read(bytesArray, 0, bytesArray.length);
    		ByteArrayOutputStream os = new ByteArrayOutputStream(bytesArray.length);
    		os.write(bytesArray, 0, bytesArray.length);
     
    		return os.toByteArray();
    	}
    pour les petits fichiers (< 20mo) aucun soucis mais les gros fichiers ne passent pas à cause d'une Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    j'ai donc regardé du coté des FileChannel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		FileChannel in = new RandomAccessFile(filePath, "rw").getChannel();
    		MappedByteBuffer map = null;
     
    		try {	
    			map = in.map(MapMode.READ_WRITE, 0, in.size());
    		}
    		finally {
    			in.close();
    		}		
    		return map;
    et là ça passe sans soucis sur les gros fichier (~400mo) et la copie de fichiers en local fonctionne sans soucis.

    mais problème, si j'essai d'envoyer ça dans un ObjectInputStream (créer à partir de l'inputStream du socket) il me sort exception "not serializable" ce qui après coup ne m'étonne guère vu que le retour de mon read renvoie un MappedByteBuffer qui n'implèmente pas serializable.

    Sachant qu'actuellement je communique d'un bout à l'autre du socket via des object(input/output)stream. il doit bien y avoir une solution du coté des channel mais je ne voit pas comment mettre ça en place

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ne charge pas des fichiers aussi gros en mémoire, c'est tout. Ils sont très bien sur disque dur. Tu n'as qu'à les lire en petits bouts.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Segment de mémoire partagée POSIX, socket et select
    Par Antoine J. dans le forum POSIX
    Réponses: 2
    Dernier message: 06/12/2011, 16h42
  2. mapping mémoire sous lunix
    Par asma_tunisienne dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 07/08/2008, 14h27
  3. Changement dans le mapping mémoire en 2.6 ?
    Par bart11064 dans le forum Linux
    Réponses: 1
    Dernier message: 27/08/2007, 16h13
  4. Réponses: 8
    Dernier message: 09/02/2007, 15h31
  5. Mapping de la mémoire
    Par Edouard Kaiser dans le forum Assembleur
    Réponses: 2
    Dernier message: 14/07/2005, 16h56

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