OutOfMemoryError avec un flux FileOutputStream

OutOfMemoryError avec un flux FileOutputStream - Java - Programmation

Marsh Posté le 16-01-2005 à 21:30:32    

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 :)

Reply

Marsh Posté le 16-01-2005 à 21:30:32   

Reply

Marsh Posté le 16-01-2005 à 21:40:26    

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
Reply

Marsh Posté le 16-01-2005 à 21:44:32    

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:

Reply

Marsh Posté le 16-01-2005 à 21:47:45    

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


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 16-01-2005 à 21:54:09    


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:

Reply

Marsh Posté le 16-01-2005 à 22:00:01    

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
Reply

Marsh Posté le 16-01-2005 à 22:07:13    

'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:

Reply

Marsh Posté le 16-01-2005 à 22:17:43    

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
Reply

Marsh Posté le 16-01-2005 à 22:24:04    

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:

Reply

Marsh Posté le 16-01-2005 à 22:29:33    

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
Reply

Marsh Posté le 16-01-2005 à 22:29:33   

Reply

Marsh Posté le 16-01-2005 à 23:57:15    

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 :)

Reply

Marsh Posté le 17-01-2005 à 10:48:30    

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)

Reply

Marsh Posté le 17-01-2005 à 12:45:53    

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:  
 

Reply

Marsh Posté le 17-01-2005 à 12:54:11    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed