Lecture d'une très grosse quantité de données

Lecture d'une très grosse quantité de données - Java - Programmation

Marsh Posté le 31-10-2002 à 18:10:15    

Voila le code qui me permet d'écrire depuis un fichier, dans un autre fichier :

Code :
  1. // Ouverture des flux
  2.         FileInputStream  srcInputStream   = new FileInputStream  (m_fPageFile);
  3.         FileOutputStream destOutputStream = new FileOutputStream (generatedFile);
  4.         // Comparer ça et la longueur rendue par File.length
  5.         //long longueur = this.m_record.getTaille () - 73;
  6.         long longueur = m_fPageFile.length();
  7.         // Lecture et écriture dans un conteneur de data
  8.         byte[] data = new byte[(int)longueur];
  9.         srcInputStream.read    (data);
  10.         destOutputStream.write (data);
  11.         // Fermeture des flux
  12.         srcInputStream.close ();
  13.         destOutputStream.close ();


 
 
Problème au moment de l'initialisation du tableau de bytes destiné a ercevoir les données lues. Quand le fichier est trop gros (56Mo ça plante !), je me retrouve avec une OutofMemoryException. Je me dit que je devrais pas lire tout d'un coup, pour tout écrire écrire d'un coup, afin d'éviter de stocker tout le fichier en mémoire. Mais comment déterminer la taille des "morceaux de données" que je vais lire puis écrire ?

Reply

Marsh Posté le 31-10-2002 à 18:10:15   

Reply

Marsh Posté le 31-10-2002 à 18:12:29    

avec un buffer
 
Y a des BufferStream en java

Reply

Marsh Posté le 31-10-2002 à 21:11:55    

ouah !!! t'es bourrin toi !!! tu copie tout le fichier dans un tableau d'un coup  :ouch:  
 
attend 2 sec et je te file le code qui faut.
le truc c'est de le faire en plusieurs petit bouts

Reply

Marsh Posté le 31-10-2002 à 21:59:39    

et voila !
 
testé et validé !

Code :
  1. package test;
  2. import java.io.*;
  3. public class TestCopy {
  4.    public static void copy(String src, String dest) throws IOException {
  5.       byte[] buffer = new byte[1024*10];
  6.       InputStream srcStream = new FileInputStream(src);
  7.       OutputStream destStream = new FileOutputStream(dest);
  8.       int copied;
  9.       while ((copied = srcStream.read(buffer)) != -1) {
  10.  destStream.write(buffer, 0, copied);
  11.       }
  12.       srcStream.close();
  13.       destStream.close();
  14.    }
  15.    public static void main (String[] args) throws IOException {
  16.       TestCopy.copy("e:\\emacs.zip", "e:\\emacs_cp.zip" );
  17.    }
  18. }


Message édité par benou le 31-10-2002 à 22:00:11
Reply

Marsh Posté le 01-11-2002 à 11:52:43    

El_Gringo a écrit a écrit :

Quand le fichier est trop gros (56Mo ça plante !), je me retrouve avec une OutofMemoryException.  
 
Je me dit que je devrais pas lire tout d'un coup, pour tout écrire écrire d'un coup, afin d'éviter de stocker tout le fichier en mémoire.



 
El_grigo il est trop fort  [:xp1700]  
 
 [:rofl]  [:rofl]  [:rofl]  
 
 [:rofl]  [:rofl]  [:rofl]  
 
 :lol:  :lol:  :lol:  
 
mékilécon  [:rofl]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 09:14:58    

benou a écrit a écrit :

et voila !
   public static void copy(String src, String dest) throws IOException {
 
      byte[] buffer = new byte[1024*10];
      InputStream srcStream = new FileInputStream(src);
      OutputStream destStream = new FileOutputStream(dest);
      int copied;
      while ((copied = srcStream.read(buffer)) != -1) {
  destStream.write(buffer, 0, copied);
      }  
      srcStream.close();
      destStream.close();
   }
}




 
C aussi ce que je fais pour récupérer un fichier à partir d'une request...  :D  
 
Mais je me suis toujours demandé s'il y avait une taille optimale a donner au table buffer de bytes pour "optimiser" la lecture-copie de bytes...
J'ai cherché sur le net mais rien trouvé...
 
Quelqu'un aurait-il des informations à m'apporter ???
Merciiiiii


---------------

Reply

Marsh Posté le 04-11-2002 à 09:18:30    

benou a écrit a écrit :

et voila !
 
testé et validé !

Code :
  1. package test;
  2. import java.io.*;
  3. public class TestCopy {
  4.    public static void copy(String src, String dest) throws IOException {
  5.       byte[] buffer = new byte[1024*10];
  6.       InputStream srcStream = new FileInputStream(src);
  7.       OutputStream destStream = new FileOutputStream(dest);
  8.       int copied;
  9.       while ((copied = srcStream.read(buffer)) != -1) {
  10.  destStream.write(buffer, 0, copied);
  11.       }
  12.       srcStream.close();
  13.       destStream.close();
  14.    }
  15.    public static void main (String[] args) throws IOException {
  16.       TestCopy.copy("e:\\emacs.zip", "e:\\emacs_cp.zip" );
  17.    }
  18. }






 
Ok, merci. Tout ce que j'demandais c'était la taille des "morceaux" à copier à chaque itérations, après j'aurai pu me débrouiller, ms bon...
Et pourquoi une taille de [1024*10] ? Une taille + importante devrait plus charger la mémoire ms offrir de meilleur perfs, non ?

Reply

Marsh Posté le 04-11-2002 à 09:19:16    

DarkLord a écrit a écrit :

 
 
El_grigo il est trop fort  [:xp1700]  
 
 [:rofl]  [:rofl]  [:rofl]  
 
 [:rofl]  [:rofl]  [:rofl]  
 
 :lol:  :lol:  :lol:  
 
mékilécon  [:rofl]  




 
 
Et si tu parlais de la vrai question au lieu d'être con ?

Reply

Marsh Posté le 04-11-2002 à 09:28:03    

El_Gringo a écrit a écrit :

 
Et si tu parlais de la vrai question au lieu d'être con ?




 :non: pas d'insultes ici !
 
et puis ce que t'as fait méritait bien une bonne petite raillerie !  :o


Message édité par benou le 04-11-2002 à 09:30:48
Reply

Marsh Posté le 04-11-2002 à 09:30:30    

El_Gringo a écrit a écrit :

 
Et pourquoi une taille de [1024*10] ? Une taille + importante devrait plus charger la mémoire ms offrir de meilleur perfs, non ?




ben comme ca ... je me suis que le faire par bloc de 10 Ko était une bonne moyenne.
 
je ne pense franchement pas qu'en mettant des blocs plus importants tu gangnera vraiment en perf. Surement un petit peu, mais ce sera vraiment négligeable.
 
et puis bon. Pour déclarer un tableau de plus 100 Ko, faut vraiment en avoir besoin, hein ! ca se fait pas comme ca pour gagner 3 nano-sesondes !

Reply

Marsh Posté le 04-11-2002 à 09:30:30   

Reply

Marsh Posté le 04-11-2002 à 09:32:48    

Darklord a écrit a écrit :

 
mékilécon




El_Gringo a écrit a écrit :

 
Et si tu parlais de la vrai question au lieu d'être con ?




 
...ça s'vaut !

Reply

Marsh Posté le 04-11-2002 à 09:34:11    

benou a écrit a écrit :

 
ben comme ca ... je me suis que le faire par bloc de 10 Ko était une bonne moyenne.
 
je ne pense franchement pas qu'en mettant des blocs plus importants tu gangnera vraiment en perf. Surement un petit peu, mais ce sera vraiment négligeable.
 
et puis bon. Pour déclarer un tableau de plus 100 Ko, faut vraiment en avoir besoin, hein ! ca se fait pas comme ca pour gagner 3 nano-sesondes !




 
Ouais, t'as raison. Merci...

Reply

Marsh Posté le 04-11-2002 à 09:34:30    

El_Gringo a écrit a écrit :

 
...ça s'vaut !




je trouve pas ... yen a un qui est un peu justifié et entouré de smiley et pas l'autre.
 
mais bon, on s'en fout ...
 

Reply

Marsh Posté le 04-11-2002 à 09:37:51    

Heu, benou, le

Code :
  1. destStream.write(buffer, 0, copied);


Que t'as écrit, c'est exactement la même chose que

Code :
  1. destStream.write(buffer);


Non ?

Reply

Marsh Posté le 04-11-2002 à 09:42:08    

Ha, et prendant qu'on est là dedant, c'est important de faire ça :

Code :
  1. // Ouverture des flux
  2.         FileInputStream  srcInputStream   = new FileInputStream  (m_fPageFile);
  3.         FileOutputStream destOutputStream = new FileOutputStream (generatedFile);
  4.         try {
  5.             // Lecture et écriture immédiate du fichier
  6.             byte[] buffer = new byte[1024*10];
  7.             while (srcInputStream.read (buffer) != -1)
  8.                 destOutputStream.write (buffer);
  9.         } finally {
  10.             // Fermeture des flux
  11.             srcInputStream.close ();
  12.             destOutputStream.close ();
  13.         }


 
...non ? Sinon, si read ou write balance une exception, on ferme pas le flux !

Reply

Marsh Posté le 04-11-2002 à 09:46:45    

El_Gringo a écrit a écrit :

Ha, et prendant qu'on est là dedant, c'est important de faire ça :
...non ? Sinon, si read ou write balance une exception, on ferme pas le flux !




ouais c'est mieux.

Reply

Marsh Posté le 04-11-2002 à 09:47:57    

El_Gringo a écrit a écrit :

Heu, benou, le

Code :
  1. destStream.write(buffer, 0, copied);


Que t'as écrit, c'est exactement la même chose que

Code :
  1. destStream.write(buffer);


Non ?




 
non. yavec le deuxième tu écris tout le buffer. avec le premier tu copies uniquement ce que tu as écrit dans le buffer.
C'est important à la fin de la copie parce que tu as pas beaucoup de chance que le fichier ait une taille qui soit multiple de la taille de ton buffer

Reply

Marsh Posté le 04-11-2002 à 09:50:40    

El_Gringo a écrit a écrit :

 
 
 
Et si tu parlais de la vrai question au lieu d'être con ?




 
mais enfin :) tu lis un fichier de 56Mo en mémoire et tu t'étonnes que tu te manges un OutOfMemoryError. Avoue qd meme que ca a de quoi etre  :heink: non?
 
enfin ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 09:54:13    

DarkLord a écrit a écrit :

 
 
mais enfin :) tu lis un fichier de 56Mo en mémoire et tu t'étonnes que tu te manges un OutOfMemoryError. Avoue qd meme que ca a de quoi etre  :heink: non?
 
enfin ...




 
Je m'étonne pas, je demande comment choisir la taille optimum des "morceaux" à lire/écrire...
Que tu rigoles, si tu veux, mais fais un effort pour essayer de répondre après qd même. Ma question était qd même pas complètement stupide...

Reply

Marsh Posté le 04-11-2002 à 09:58:49    

El_Gringo a écrit a écrit :

 
Ma question était qd même pas complètement stupide...




 
ah non je dis pas. Par contre la façon de la présenter :D
bon tu as la réponse à ta question ou pas là?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 10:02:17    

Ouais, enfin, disons que selon benou, ça doit pas être frachment primordial, surtout que dans mon cas, je fais pas tout un tas de copies à la volée. Mais si t'as des précisions à apporter, quant à l'optimisation de la copie de fichier en fonction de la taille du buffer, j't'écoute...

Reply

Marsh Posté le 04-11-2002 à 14:14:04    

El_Gringo a écrit a écrit :

Ouais, enfin, disons que selon benou, ça doit pas être frachment primordial



la taille du buffer est pas primordiale. (quelques Ko)
 
Faire une copie de 56 Mo en mémoire c'est suicidaire !!!!! :ouch:  
:gun:

Reply

Marsh Posté le 04-11-2002 à 14:19:00    

benou a écrit a écrit :

 
la taille du buffer est pas primordiale. (quelques Ko)
 
Faire une copie de 56 Mo en mémoire c'est suicidaire !!!!! :ouch:  
:gun:  




 
Ouais, enfin, 56Mo c'est qd même carrément suppra exceptionnel ds le cadre de mon appli, j'dirais même que ça peut jammauis arriver. C'était juste pr un test...
Ms bon, là c changé... Merci d'ailleurs !

Reply

Marsh Posté le 04-11-2002 à 14:31:58    

même 10Mo ou 1Mo c'est énorme !!! et complétement inutile en plus ...
 
si j'insiste c'est pour être sur que tu recommenceras plus en te disant "c'est pas grave".

Reply

Marsh Posté le 04-11-2002 à 14:35:07    

Je recommencerai plus Monsieur benou... :jap:  
 
Ms plus sérieusement, bien sur que je recommencerai plus, j'ai très bien compris que ça peut prendre une place énorme en mémoire...

Reply

Marsh Posté le 04-11-2002 à 15:18:37    

El_Gringo a écrit a écrit :

Je recommencerai plus Monsieur benou... :jap:



 
c'est bien mon petit  
 
 
 
:D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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