Lecture d'une très grosse quantité de données - Java - Programmation
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
attend 2 sec et je te file le code qui faut.
le truc c'est de le faire en plusieurs petit bouts
Marsh Posté le 31-10-2002 à 21:59:39
et voila !
testé et validé !
Code :
|
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
mékilécon
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...
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
Marsh Posté le 04-11-2002 à 09:18:30
benou a écrit a écrit : et voila ! testé et validé !
|
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 ?
Marsh Posté le 04-11-2002 à 09:19:16
DarkLord a écrit a écrit : El_grigo il est trop fort mékilécon |
Et si tu parlais de la vrai question au lieu d'être con ?
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 ? |
pas d'insultes ici !
et puis ce que t'as fait méritait bien une bonne petite raillerie !
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 !
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 !
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...
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 ...
Marsh Posté le 04-11-2002 à 09:37:51
Heu, benou, le
Code :
|
Que t'as écrit, c'est exactement la même chose que
Code :
|
Non ?
Marsh Posté le 04-11-2002 à 09:42:08
Ha, et prendant qu'on est là dedant, c'est important de faire ça :
Code :
|
...non ? Sinon, si read ou write balance une exception, on ferme pas le flux !
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.
Marsh Posté le 04-11-2002 à 09:47:57
El_Gringo a écrit a écrit : Heu, benou, le
|
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
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 non?
enfin ...
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 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...
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
bon tu as la réponse à ta question ou pas là?
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...
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 !!!!!
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 !!!!! |
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 !
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".
Marsh Posté le 04-11-2002 à 14:35:07
Je recommencerai plus Monsieur benou...
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...
Marsh Posté le 04-11-2002 à 15:18:37
El_Gringo a écrit a écrit : Je recommencerai plus Monsieur benou... |
c'est bien mon petit
Marsh Posté le 31-10-2002 à 18:10:15
Voila le code qui me permet d'écrire depuis un fichier, dans un autre fichier :
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 ?