Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2012 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  OutOfMemoryError avec un flux FileOutputStream

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

OutOfMemoryError avec un flux FileOutputStream

n°954161
paowz
Posté le 16-01-2005 à 21:30:32  profilanswer
 

bonjour a tous!
 
Voila,je me heurte à une erreur que je ne saisis pas trop...
J'essaie d'ecrire dans un fichier des données collectées par une socket..
Passé 12ko, g une erreur OutOfMemory, pourtant j'ai rajouté en paramètre -Xmx 10m...pour avoir 10Mo de marge...ce qui suffit largement à mes besoins...
 
Avez-vous une idée sur la question??  :??:  
 
merci :)

mood
Publicité
Posté le 16-01-2005 à 21:30:32  profilanswer
 

n°954176
benou
Posté le 16-01-2005 à 21:40:26  profilanswer
 

tu ne devrais pas toucher à ce genre de paramètres si tu ne les comprends pas : là, tu as bcp trop réduit la taille mémoire utilisable pour ton programme.
 
=> retire ce paramètre et ca aura bcp plus de chances de marcher ...
 
après, si le OutOfMemory continue, c'est que tu as une coquille dans ton code ...


---------------
ma vie, mon oeuvre - HomePlayer
n°954182
paowz
Posté le 16-01-2005 à 21:44:32  profilanswer
 

ben, à la base je ne mettais pas ce paramètre...
Mais bon..un OutOfMemory au bout de 12Ko... :cry:  
quant à la coquille dans le code...je cherche mais.... :na:

n°954190
benou
Posté le 16-01-2005 à 21:47:45  profilanswer
 

balance le code qui fait la copie de la socket au fichier, je te dirai si je vois quelquechose ...


---------------
ma vie, mon oeuvre - HomePlayer
n°954199
paowz
Posté le 16-01-2005 à 21:54:09  profilanswer
 


File newFic = new File(rep,fichier);
try{
   newFic.createNewFile();
   FileOutputStream out = new FileOutputStream(newFic);
   while(true){
               //je recupère le contenu de la socket
               buffer = com.getData();
 
               //je teste si il faut fermer le fichier
               if (buffer.equals(Communication.PUT_OK)){
                   out.close();
                   break;
               }
 
               //je vide mon buffer dans le fichier..
               out.write(buffer.getBytes());
 
            /*   out.flush();  */
               }
            }
            catch (IOException e){
                  //en cas d'erreur...
            }
 
voila...si tu vois qq chose... :jap:

n°954206
benou
Posté le 16-01-2005 à 22:00:01  profilanswer
 

c'est quoi ton objet com ?
 
logiquement tu devrais transférer les octets de ta socket vers ton fichier petit à petit, pas d'un coup. En le faisant en 1 seul coup, tu risques d'avoir des problèmes sur des gros fichiers ...


---------------
ma vie, mon oeuvre - HomePlayer
n°954214
paowz
Posté le 16-01-2005 à 22:07:13  profilanswer
 

'com' est un objet qui permet d'emettre et de recevoir dans un buffer, des données au travers de socket...
 

Citation :


logiquement tu devrais transférer les octets de ta socket vers ton fichier petit à petit


 
ben, c'est ce que je suis sensé faire avec la boucle while(), je reçois les données par boc de 512 octets..
..et le com.getData() renvoie une string qui est 'buffer', variable réinitialisée à chaque itération..donc... :na:

n°954232
benou
Posté le 16-01-2005 à 22:17:43  profilanswer
 

je te demandais le type de l'objet ...
c'est pas un object de l'API standard il me semble  
 
c'est cet objet qui te garantit de recevoir les données par bloc de 512 octets ?
 
remarque : c'est bizarre que ca te retourne une String (des caractères) et pas des octets ...


---------------
ma vie, mon oeuvre - HomePlayer
n°954237
paowz
Posté le 16-01-2005 à 22:24:04  profilanswer
 

non, en effet, ca fait pas parti de l'api standard...c une classe à part..
les blocs de 512, c une initialisation en 'dur' d'une variable...je la pense pas responsable de l'erreur que je cherche...
Pour le retour en string, ca n'a pas posé problème pour les petits fichiers que ce soit en mode texte ou en binaire...le contenu du buffer n'est probablement pas affichable ou alors avec des têtes de mort  ;) mais il n'altère pas les données en elles-mêmes..
 :wahoo:

n°954241
benou
Posté le 16-01-2005 à 22:29:33  profilanswer
 

bha si :  c'est risqué de passer un binaire en caractères ...
 
sans connaître la classe de com, je peux pas te dire pkoi ca plante [:spamafote]  


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 16-01-2005 à 22:29:33  profilanswer
 

n°954286
paowz
Posté le 16-01-2005 à 23:57:15  profilanswer
 

ouais, j'ai essayé avec un tableau de byte..;mais ca change rien...:( je sais pas d'ou ca vient..
en tout cas, merci Benou :)

n°954381
Bidem
Posté le 17-01-2005 à 10:48:30  profilanswer
 

Code :
  1. while(true){
  2.   ...
  3.   if (buffer.equals(Communication.PUT_OK)){
  4.     ...
  5.     break;
  6.   }
  7.   ...
  8. }


 
A mon avis tu ne passes jamais dans le if donc tu boucle à l'infini et donc la mémoire explose.
 
La classe Communication est une classe que tu as développée ou c'est un composant récupéré ailleurs ?
Si c'est toi qui l'as faite, je te conseille de de la vérifier, l'erreur doit se trouver là (getData() ne retourne jamais Communication.PUT_OK)

n°954476
paowz
Posté le 17-01-2005 à 12:45:53  profilanswer
 

Citation :

Si c'est toi qui l'as faite, je te conseille de de la vérifier, l'erreur doit se trouver là (getData() ne retourne jamais Communication.PUT_OK)


 
et oui..mais l'erreur se produit avant le terme de la réception du fichier..a seulement 12ko.
 
En fait, je pense pas que la classe Communication soit responsable dans la mesure où il s'agit d'un client FTP et que le download de fichier quelque soit leur taille ne pose pas de problèmes.
Pour l'upload, c le processus inverse, mettre un bout du code du client dans le serveur et vice-versa...g donc merdé qq part :lol: ..Et je vois pas encore l'erreur..mais je trouverai   :sweat:  
 

n°954487
beemer
Posté le 17-01-2005 à 12:54:11  profilanswer
 

euh 10Mo pour une machine virtuelle c'est pas assez ....
tu fais pas du j2me quand meme


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  OutOfMemoryError avec un flux FileOutputStream

 

Sujets relatifs
le flux n'est pas extensioble ??Diriger un flux XML vers un parseur XSLT
synchroniser 2 flux par un scriptPbs de flux dans un fichier
Les flots/flux en C ...Flux désynchronisé comment régler ca?
[flux] créer un flux nul ou un flux fictifComment créer un flux RSS ?
Php qui gere les flux https.[C#]Gestion des flux
Plus de sujets relatifs à : OutOfMemoryError avec un flux FileOutputStream


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR