[java] performance d'une copie de fichier

performance d'une copie de fichier [java] - Java - Programmation

Marsh Posté le 18-06-2004 à 15:13:47    

Mon jar executable doit copier, vers un DD, un fichier(400ko) qui est inclus dans l'archive.
 
Je le fais avec :
     InputStream is = getClass().getResourceAsStream(inputFileName);
      OutputStream os = new FileOutputStream(outputFileName);
       
      int b;  // byte readed in the file
      while((b = is.read()) != -1) {
        os.write(b);
      }
      is.close();
      os.close();

 
Si c'est un DD local, rien d'horrible mais c'est très long vers le DD d'un serveur.
 
J'ai essayé aussi :
      FileChannel srcChannel = new FileInputStream(inputFileName).getChannel();
      // Create channel on the destination
      FileChannel dstChannel = new FileOutputStream(outputFileName).getChannel();
       
      // Copy file contents from source to destination
      dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
       
      // Close the channels
      srcChannel.close();
      dstChannel.close();

 
mais ça ne marche pas en lecture dans le jar.
Y a t'il d'autres méthodes ?

Reply

Marsh Posté le 18-06-2004 à 15:13:47   

Reply

Marsh Posté le 18-06-2004 à 20:59:07    

Premierement essaie de mettre un BufferedOutputStream devant le FileOutputStream :
 
out = new BufferedOutputStream(new FileOutputStream(....));
 
Deuxiement evite de copier octet par octet et utilise un tableau :
 
byte[] buffer = new byte[256];
int q = in.read(buffer);
while (q != -1)
{
out.write(buffer, 0, q);
q = in.read(buffer);
}

Reply

Marsh Posté le 18-06-2004 à 22:10:52    

256 c'est pas beaucoup... moi je dis au minimum 4096

Reply

Marsh Posté le 18-06-2004 à 22:11:00    

+1
 
sacré gain de temps. voici les deux version
 

Code :
  1. // -----------------------------------------------------------------
  2.   // Copie bit à bit d'un fichier (accès disque)
  3.   // -----------------------------------------------------------------  
  4.   // 272112 ms (34 Mo)
  5.   start.setTime(new Date());
  6.   fis = new FileInputStream("hello.txt" ) ;   // source
  7.   fos = new FileOutputStream("empty.txt" ) ;  // destintation
  8.   int b ;
  9.   while ((b = fis.read()) != -1)
  10.    fos.write(b) ;
  11.   fis.close() ;
  12.   fos.close() ;
  13.   System.out.println("copie ok" ) ;
  14.   stop.setTime(new Date());
  15.   System.out.println("runtime : " + (stop.getTimeInMillis() - start.getTimeInMillis()) + " ms" ) ;
  16.   // -----------------------------------------------------------------
  17.   // Copie bit à bit d'un fichier + buffer (copie mémoire du fichier)
  18.   // -----------------------------------------------------------------
  19.   // 7350 ms (34 Mo)
  20.   start.setTime(new Date());
  21.   fis = new FileInputStream("hello.txt" ) ;   // source
  22.   BufferedInputStream bis = new BufferedInputStream(fis) ;
  23.   fos = new FileOutputStream("empty.txt" ) ;  // destintation
  24.   BufferedOutputStream bos = new BufferedOutputStream(fos) ;
  25.   //int b ;  
  26.   while ((b = bis.read()) != -1)
  27.    bos.write(b) ;
  28.   bis.close() ;
  29.   bos.close() ;
  30.   fis.close() ;
  31.   fos.close() ;
  32.   System.out.println("copie ok" ) ;
  33.   stop.setTime(new Date());
  34.   System.out.println("runtime : " + (stop.getTimeInMillis() - start.getTimeInMillis()) + " ms" ) ;


Message édité par jagstang le 18-06-2004 à 22:11:27

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 18-06-2004 à 22:11:57    

Taz, j'attends tes remarques :D


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 18-06-2004 à 22:31:55    

que tu peux pas comparer aussi simplement à cause de la bufferisation de ton système de fichiers / OS

Reply

Marsh Posté le 18-06-2004 à 23:57:24    

tu me deçois :o


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 19-06-2004 à 03:16:27    

256 / 4096, ca changera pas grand chose.  
 
Le vrai gain vient de la bufferisation apres 256 ou 4096 impliquera un nombre de passage dans la boucle plus ou moins important. Par contre en mettant 1 c est pas forcement une bonne chose.
 
Essaie aussi de mettre un BufferInputStream en entree si ton fichier ne vient pas d un jar (je pense que les fichiers qui viennent des jar sont deja bufferises )

Reply

Marsh Posté le 19-06-2004 à 03:17:50    

arf j ai pas vu que tu l avais mis dans ton code (le BufferedInputStream) :-)

Reply

Marsh Posté le 19-06-2004 à 03:18:56    

rqe // a Taz, la il a meme pas utilise de tableau dans son code

Reply

Marsh Posté le 19-06-2004 à 03:18:56   

Reply

Marsh Posté le 19-06-2004 à 08:23:14    

Merci à tous pour votre aide
je referai des tests lundi au boulot.
Bon WE

Reply

Marsh Posté le 23-06-2004 à 13:53:54    

J'ai fait des tests juste en ajoutant la bufferisation. C'est parfait
Dans mon cas, je passe de 200s à 1.5s
Merci encore.

Reply

Sujets relatifs:

Leave a Replay

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