Création de fichier multiples

Création de fichier multiples - Java - Programmation

Marsh Posté le 15-02-2011 à 12:19:11    

Bonjour,
 
dans le cadre de nom travail, je suis amené à créer une application qui doit ouvrir un grand nombre de fichiers en simultané. Lesdits fichiers ne doivent pas être refermé de suite après qu'une chose soit écrite dedans, car il est possible qu'une autre chose soit écrite dedans plus tard dans l'exécution du programme.
 
A l'heure actuelle mon appli se déroule comme ceci :
 
- ouverture de X fichiers (X pouvant être un nombre très grand) par exemple 100000 fichiers!
- un algorithme particluier écrit dans les divers fichiers (une boucle écrit un string dans un fichier à chaque itération, mais on ne peut pas savoir à l'avance quel fichier)
- fermeture des fichiers
 
Le problème que je rencontre se situe à l'ouverture des fichiers car sur de très grandes valeurs de X, la JVM me rapporte l'erreur suivante :

An IO error occured.
java.io.FileNotFoundException: ../../experience//8983.0-13983.0.basenum (Too many open files)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
    at java.io.FileWriter.<init>(FileWriter.java:46)
    at preprocessing.SimilarBiclusters.initFiles(SimilarBiclusters.java:133)
    at preprocessing.SimilarBiclusters.start(SimilarBiclusters.java:36)
    at mains.MainSimilarBiclusters.main(MainSimilarBiclusters.java:30)


 
Je suppose que cela veux dire que j'ai trop de fichiers ouverts en même temps, mais je ne vois pas comment je pourrai faire autrement.
Donc si vous avez des idées, je suis preneur.
 
En d'autres termes, comment changer dans la JVM le nombre maximum de descripteurs ouverts,
cela dépend il de l'architecture ? 32bits vs 64bits ?
 
 
PS : j'ai fait quelques recherches sur le net sans résultats.
 
Merci par avance.

Reply

Marsh Posté le 15-02-2011 à 12:19:11   

Reply

Marsh Posté le 15-02-2011 à 12:28:35    

Tu ne peux pas ouvrir le fichier juste en cas de besoin ?

Reply

Marsh Posté le 15-02-2011 à 13:20:51    

C'est faisable mais question performance ca me ruine l'application, j'y avais déjà pensé...

Reply

Marsh Posté le 15-02-2011 à 14:09:24    

Je pense aussi que le nb de fichiers pouvant être ouvert en simultané dépend de l'OS (Linux ou Windows) et effectivement, s'il est 32 bits ou 64.
 
Comme le faisait remarquer flo850 (d'une manière indirecte), c'est pas normal d'avoir autant de fichiers à ouvrir en même temps, t'as donc un pb d'algo. Que ça ruine les perfs d'ouvrir fichier par fichier, c'est un peu étonnant mais bon, Java, c'est pas une bête de course non plus, du C serait peut-être plus approprié dans ton cas. C'est un peut comme vouloir faire du calcul matriciel sur de grosses matrices en php :/ C'est pas fait pour niveau perfs...
 
Après, si t'es obligé de faire ton dév en java, tu peux mettre en place le même genre de système que linux implémente pour écrire dans les fichiers. Il met d'abord les données en cache en ram puis effectue des écritures différées régulièrement pour vider le cache. Donc, en gros, tu crée un cache en mémoire qui représente tes fichiers comme s'ils étaient ouverts, tu mets les données à écrire dedans et de temps en temps, tu effectues des écritures ;) Ca devrait résoudre ton pb de perfs.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-02-2011 à 14:27:20    

Merci pour la réponse, je vais voir pour implémenter ca dans mon application et je vous tiens au courant.
S'il y en a d'autre qui ont des pistes, n'hésitez pas.
 
Cordialement
Toaster

Reply

Marsh Posté le 15-02-2011 à 15:00:21    

Sinon tu t'en sors pas en ayant seulement 1 ou 2 fichiers qui sont le "merge" de tous tes petits fichiers?
En utilisant des formats genre XML tu peux ensuite naviguer rapidement dans ton système. Une fois que t'as fait tout ton traitement, tu expédies tout ça dans une moulinette qui te recrée tes X fichiers, un par un


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 15-02-2011 à 15:06:46    

Pour pouvoir mieux t'aider, faudrait nous en dire plus sur ce que tu cherches à implémenter.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-02-2011 à 15:15:57    

flo850 a écrit :

Tu ne peux pas ouvrir le fichier juste en cas de besoin ?


 

Toaster57 a écrit :

C'est faisable mais question performance ca me ruine l'application, j'y avais déjà pensé...


fait un pool de fichier qui va manager le nombre de fichier ouvert  : il en ouvre toujours 100 au maximum. Quand tu as besoin d'ouvrir un nouveau fichier non gérer par le pool, le pool en ferme un autre...


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 15-02-2011 à 16:48:38    

Merci à vous tous pour les réponses,  
au final j'ai travaillé tout en mémoire, les données sont stockées dans des structures appropriées en mémoire et écrite toutes en même temps à la fin une fois que l'algo est passé.
Le 1er post de rufo m'a bien mis sur la voie
 
Bien à vous
Toaster

Reply

Sujets relatifs:

Leave a Replay

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