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

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°238105
El_gringo
Posté le 31-10-2002 à 18:10:15  profilanswer
 

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 ?

mood
Publicité
Posté le 31-10-2002 à 18:10:15  profilanswer
 

n°238108
charlene
Verba volant, scripta manent
Posté le 31-10-2002 à 18:12:29  profilanswer
 

avec un buffer
 
Y a des BufferStream en java

n°238152
benou
Posté le 31-10-2002 à 21:11:55  profilanswer
 

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

n°238166
benou
Posté le 31-10-2002 à 21:59:39  profilanswer
 

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
n°238272
darklord
You're welcome
Posté le 01-11-2002 à 11:52:43  profilanswer
 

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
n°239067
Dephi
Posté le 04-11-2002 à 09:14:58  profilanswer
 

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


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

n°239068
El_gringo
Posté le 04-11-2002 à 09:18:30  profilanswer
 

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 ?

n°239069
El_gringo
Posté le 04-11-2002 à 09:19:16  profilanswer
 

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 ?

n°239073
benou
Posté le 04-11-2002 à 09:28:03  profilanswer
 

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
n°239074
benou
Posté le 04-11-2002 à 09:30:30  profilanswer
 

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 !

mood
Publicité
Posté le 04-11-2002 à 09:30:30  profilanswer
 

n°239075
El_gringo
Posté le 04-11-2002 à 09:32:48  profilanswer
 

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 !

n°239076
El_gringo
Posté le 04-11-2002 à 09:34:11  profilanswer
 

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...

n°239077
benou
Posté le 04-11-2002 à 09:34:30  profilanswer
 

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 ...
 

n°239078
El_gringo
Posté le 04-11-2002 à 09:37:51  profilanswer
 

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 ?

n°239080
El_gringo
Posté le 04-11-2002 à 09:42:08  profilanswer
 

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 !

n°239082
benou
Posté le 04-11-2002 à 09:46:45  profilanswer
 

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.

n°239083
benou
Posté le 04-11-2002 à 09:47:57  profilanswer
 

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

n°239087
darklord
You're welcome
Posté le 04-11-2002 à 09:50:40  profilanswer
 

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
n°239088
El_gringo
Posté le 04-11-2002 à 09:54:13  profilanswer
 

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...

n°239089
darklord
You're welcome
Posté le 04-11-2002 à 09:58:49  profilanswer
 

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
n°239091
El_gringo
Posté le 04-11-2002 à 10:02:17  profilanswer
 

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...

n°239203
benou
Posté le 04-11-2002 à 14:14:04  profilanswer
 

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:

n°239204
El_gringo
Posté le 04-11-2002 à 14:19:00  profilanswer
 

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 !

n°239214
benou
Posté le 04-11-2002 à 14:31:58  profilanswer
 

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".

n°239217
El_gringo
Posté le 04-11-2002 à 14:35:07  profilanswer
 

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...

n°239234
benou
Posté le 04-11-2002 à 15:18:37  profilanswer
 

El_Gringo a écrit a écrit :

Je recommencerai plus Monsieur benou... :jap:



 
c'est bien mon petit  
 
 
 
:D

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[ C, C++] SOCKET : format des donnees envoyees avec fonction send()transfert de data d'un fichier csv dans une base de données mysql
Maquette 'interactive' : données stockées en local ?[Postgresql] perte de données lors d'insertion en charge
[C] Problème très con sur une fonction apparemment super simpleAfficher des données dynamiques sur plusieurs pages
[PHP, MySQL] Base de données MySQL et Unicode...Transformation d'hexa en caractère dans une lecture de fichier
Comment on ajoute un champ dans une base de données 
Plus de sujets relatifs à : Lecture d'une très grosse quantité de données


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