IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Detecter la modification d'un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier Avatar de moomba
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 104
    Points
    104
    Par défaut Detecter la modification d'un fichier
    Bonjour

    Je cherche à faire dialoguer un programme en Fortran, et un programme en JAVA. Pourquoi cela me direz vous ? Et bien le fortran est optimisé pour le calcul, et le java s'occupe de la partie réseau.

    Dans ce cadre, une solution simple consisterai à faire dialoguer les 2 programmes par l'intermédiaire d'un fichier texte. Seul pépin, ils doivent tourner en même temps, et le programme Java ne doit pas utiliser du tout de temps CPU (le programme fortran doit tout avoir).

    Il y a donc 3 phases :
    1. Le programme JAVA récupère les données réseau et les transmet au programme fortran. Il lui donne ensuite l'ordre de démarrer le calcul. (tout se fait par l'intermédiaire d'un fichier texte). Durant cette phase, l'utilisation du CPU importe peu. A la fin de cette étape, le programme java libère toutes les ressources possibles.

    2. Le programme fortran démarre son calcul. Il doit alors bénéficier de toute la puissance possible, cache, ram, HDD et CPU compris. Le programme JAVA doit rester dans son coin et attendre.
      Une fois le calcul finis, le programme fortran indique dans un fichier texte qu'il a finis.

    3. Enfin, le programme java ayant détecté une modification du fichier texte vas aller le lire pour voir si le calcul est finis (il peut aussi lire une erreur qu'il communiquera au serveur). Il lit ensuite le fichier de données contenant les résultats, il les transmets par le réseau, puis il attend le cycle suivant.


    Je cherche donc à épier une modification d'un fichier texte sans utiliser la moindre ressource. Est ce possible ?

    Si vous avez une meilleur idée pour faire dialoguer les programmes, je suis preneur
    "Celui qui à le pouvoir de faire le mal, mais qui ne le fait pas, celui là est le prince de l'univers." (shakespeare)

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Pour ce genre de problème, le plus efficace pour être sur de laisser le max de mémoire au programme fortran serait de découper totalement les 3 phases en 2 application java et une fortan qui se termineraient totalement quand elles ont terminé leur tache.
    Un shel script(ne consomme quasiment pas de mémoire) se chargerait de les appeler les uns après les autre.

    Après si tu demandes cela c'est surement que ce n'est pas possible. Malheureusement la seule façon que je connaise en java de détercter la modification d'un fichier est de vérifier sa date de modification a intervale régulier et donc de garder un thread en daemon.

  3. #3
    Membre régulier Avatar de moomba
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 104
    Points
    104
    Par défaut
    Merci beaucoup pour ta réponse . L'idée n'est pas mauvaise, mais malheureusement, dans le cas présent, l'optimisation temporelle est de mise.

    Je m'explique:

    Le programme Fortran alloue de la mémoire pour conserver les données.
    Sur une total de 50 PCs en réseau, plusieurs millions de points vont être répartis (un point = 3 composantes de vitesses, une température, une densité, une pression, etc etc), soit énormément de points par PC. Les écrire sur les HDD puis les relire prendrait beaucoup trop de temps
    Le goulet d'étranglement doit se situer au niveau du cache du CPU, on doit optimiser les accès à la ram (stripping, etc), alors les appels au HDD... on doit les considérer comme proscrits
    Le temps de démarrage d'un programme JAVA est lui aussi trop long, et comme les HDD sont réseau, cela ferait appel à ce dernier, qui sera déjà saturé.

    Le gros pépin sur ce réseau vient du fait que certains PC sont sous linux, et d'autre sous windows. Il me faut donc un moyen totalement portable de les faire dialoguer. Je ne peut pas faire appel aux fonctions intrinsèques tel MPI et compagnie. (MPI n'est pas compatible windows)

    Peut être peut-on utiliser une autre méthode pour faire dialoguer les 2 programmes, mais j'avoue que je pèche un peu... Si tu as une idée, n'hésite pas
    "Celui qui à le pouvoir de faire le mal, mais qui ne le fait pas, celui là est le prince de l'univers." (shakespeare)

  4. #4
    Membre habitué Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Points : 190
    Points
    190
    Par défaut
    Bonjour,

    C'est un domaine que je ne connais vraiment pas bien mais as tu essayé des recherches du coté de "CORBA"? (pour faire communiquer des langages)
    En espérant que ça puisse t'aider,

    titourock
    Dans la vie, il y a trois sortes de mathématiciens : ceux qui savent compter et ceux qui ne savent pas...

    Ne jamais jouer à saute-moutons avec une licorne...

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ou sinon via une vieille socket à l'ancienne.

    Ou encore un mécanisme à base de deux fichiers:
    Un qui contient les données et un qui sert de flag pour dire à java de démarrer.

    En tout cas tu peux toujours imaginer un daemon en java qui vérifie une seule fois toutes les 5 secondes (avec un lieux listFiles.length ou un new File("xxx").exists(); ) le contenu d'un répertoire, niveau coût mémoire et CPU c'est minimal un pauvre thread avec un Sleep (5000) fera l'affaire, vu le volume du calcul je suppose que 5 secondes de plus ne couteront rien.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre régulier Avatar de moomba
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 104
    Points
    104
    Par défaut
    C'est un domaine que je ne connais vraiment pas bien mais as tu essayé des recherches du coté de "CORBA"? (pour faire communiquer des langages)
    En espérant que ça puisse t'aider,
    Oui, cette idée m'as aidé, merci Même si il s'agit d'une approche trop complexe pour le moment, je garde cette idée sous le coude au cas où j'ai besoin de perfectionner les performances.

    Ou sinon via une vieille socket à l'ancienne.
    Là, on sort de mon domaine de connaissances
    Il s'agit d'utiliser une écoute sur un port, c'est ça ? Le fortran ne possédant pas (à ma connaissance) d'API réseau, comment réaliser une telle chose ?

    Ou encore un mécanisme à base de deux fichiers:
    Un qui contient les données et un qui sert de flag pour dire à java de démarrer.
    C'est ce que j'avais en idée. En fait, je me demandais si le fait de simplement vérifier si le fichier avait été modifié depuis la dernière lecture n'était pas moins gourmand en mémoire que le fait de le lire. En fait, ne possédant pas les droits admins, je ne peut qu'utiliser le disque réseau, et donc il faut aussi optimiser de ce côté : faire le moins de requêtes réseau possible. Là, seul un expérimenté pourra me répondre, en tout cas, j'en sais rien

    En tout cas tu peux toujours imaginer un daemon en java qui vérifie une seule fois toutes les 5 secondes (avec un lieux listFiles.length ou un new File("xxx").exists(); ) le contenu d'un répertoire, niveau coût mémoire et CPU c'est minimal un pauvre thread avec un Sleep (5000) fera l'affaire, vu le volume du calcul je suppose que 5 secondes de plus ne couteront rien.
    Effectivement, le volume étant énorme, je vais accepter cette concession. Cependant, existe t'il un moyen d'optimiser l'occupation mémoire de Java (sur 2 plans : le charger entièrement dés le départ (plus de demande au HDD réseau), et consommer le moins de ram possible)? J'entend par là qu'un programme Java à, à mon avis, tendance à être un peut gourmand en ressources.

    Je vais déjà tester tout ceci, on verra bien. J'espère simplement que la création d'un cluster de calcul est possible sur un réseau si hétérogène (Linux (Ubuntu, Suse), Windows XP/2000, CPU simples ou doubles cœurs, (P4 ou Core 2 Duo), etc... )... Il vas en plus falloir détecter les performances des machines pour bien répartir les points de calcul (c'est possible de connaitre la fréquence du CPU et la ram installé à partir de JAVA ?)

    Merci à tous pour votre aide

    (PS: si vous avez une idée d'optimisation, ou si vous savez ce qui est le plus demandant en requêtes réseau entre lire un fichier et vérifier sa mise à jours, je suis preneur )
    "Celui qui à le pouvoir de faire le mal, mais qui ne le fait pas, celui là est le prince de l'univers." (shakespeare)

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La question est que doit réaliser java par la suite, mais bon en jouant sur les paramètres d'initialisation, ça doit être jouable, sachant qu'un system de polling tel que je le décrit ne coute quasiment rien (une boucle toutes les 5 secondes c'est pas 20Mo de mémoire ni 20% de cpu, c'est presque rien, il n'y a quasiment pas d'objets créés, d'où quasiment pas de garbage collection).

    Il te suffit de faire le tests sur une des machines les plus "faibles" de ton parc pour voir le cout réel.

    De plus tu peux effectivement jouer sur les valeurs minimales/maximales de mémoire occupée par la JVM avec les paramètre -Xms -Xmx.


    Mais sinon t'as pas moyen de lancer des commandes système en Fortran (genre exécuter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar monJar.jar monFichier.fich
    c'est injouable?
    Car sinon il te suffit de déclencher ça au moment idoine depuis fortran et l'affaire est close.
    Par exemple si tu utilises le compilateur GNU fortran 77 tu as çà: http://www.delorie.com/gnu/docs/gcc/g77_316.html

    Qui permet d'appeler une commande système.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre régulier Avatar de moomba
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 104
    Points
    104
    Par défaut
    Merci pour ces précisions. Je vais essayer sur les vieux P4 et voir ce qu'ils en disent. (c'est que c'est peut être vieux, mais ca gaz pas mal ces trucs là)

    Je ne connaissait pas la subroutine call system() J'avoue avoir pourtant cherché longtemps, mais apparemment pas au bon endroit...
    Voilà une très bonne nouvelle. Si les programme java, aussi léger soit-il, démarre assez vite, cela peut valoir le coup. (je ne pense pas que cela vas dépasser 5 s) Je vais essayer dés que possible. (mais pour le moment, ce sera sur sur un seul PC, le réseau étant non dispo jusque début janvier. )

    Mon problème est donc résolus pour le moment. Ce n'est pas super optimisé, mais ça ira et ça tiendra le temps qu'il faudra. Je vais gagner beaucoup de temps pour faire mes calculs.

    Encore merci à tous , et spécials thanks à toi sinok

    Attendez vous à me revoir débarquer, avec d'autres demandes dans le genre, le code sera de plus en plus lourd, et il arrivera un moment où il faudra mieux optimiser la partie réseau (CORBA ?)

    Bonnes fêtes à tous
    "Celui qui à le pouvoir de faire le mal, mais qui ne le fait pas, celui là est le prince de l'univers." (shakespeare)

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Faire du CORBA en fortran va en fait impliquer que tu feras uniquement du C++ pour la couche Corba, en effet CORBA est définitivement orienté Objet (Common Object Request Broker Architecture)...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    Si tu conserves ta solution de fichier, tu peux essayer de gérer les événements d'écriture de fichiers avec jNotify.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    jNotify n'est qu'une surcouche à un thread tel qu'expliqué plus haut.

  12. #12
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    jNotify fonctionne avec un système événementiel fourni par le système d'exploitation. C'est pour cela qu'il ne supporte que Windows et Linux (INotify API). C'est aussi pour cela qu'il faut installer une dll ou un so, en plus des jars.

  13. #13
    Membre régulier Avatar de moomba
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 104
    Points
    104
    Par défaut
    Bonjour tout le monde

    Merci pour vos réponses.

    Faire du CORBA en fortran va en fait impliquer que tu feras uniquement du C++ pour la couche Corba, en effet CORBA est définitivement orienté Objet (Common Object Request Broker Architecture)...
    Dans une vie antérieur, j'ai fait du C++, mais c'était il y a bien longtemps... J'avoue ne plus du tout connaitre maintenant. Mais comme cela ressemble au JAVA, je pourrais toujours m'y remettre.

    jNotify fonctionne avec un système événementiel fourni par le système d'exploitation.
    Cela signifie t-il que le threat associé agira comme un listener en interface JFrame ? (i.e. ne pas consommer un parsec de CPU)
    Mais encore une fois, il faudra de toute façon utiliser le réseau, puisque les fichiers sont sur un disque réseau distants. En y repensant, quitte à utiliser des fichiers pour faire dialoguer les 2 programmes, autant plutôt faire directement dialoguer tous les PC par fichiers, cela diminuera d'une manière conséquente l'utilisation du réseau. A mon avis, la solution des fichiers n'est acceptable que tant que le réseau supporte le traffic. (lié au nombre de PC)

    Je tente actuellement d'utiliser le système LAM MPI, mais pas moyen de le compiler sous windows (Mingw). A moins de trouver comment compiler tout ça, (manque le support des threat, et en supprimant le test, impossible de finir le ./configure sans erreurs ), il faudra mettre de côté les PC sous windows.
    Ils sont moins nombreux, donc je pense utiliser le système avec des fichiers (avec JAVA ou sans, je vais tester) pour les machines sous windows, et le LAM MPI pour les linux. Cela désengorge l'accès au disque dur réseau.

    Je suis contraint de faire le noyau de calcul en Fotran, d'où la difficulté

    J'avais une autre idée : peut t-on "geler" et "dégeler" un processus JAVA avec une commande ? (genre "numero_du_processus -wait=1", "numero_du_processus -wait=0")
    "Celui qui à le pouvoir de faire le mal, mais qui ne le fait pas, celui là est le prince de l'univers." (shakespeare)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Detection de modification sur les dossiers et fichiers
    Par smarties dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 02/01/2010, 17h36
  2. Réponses: 6
    Dernier message: 26/09/2005, 10h38
  3. Réponses: 20
    Dernier message: 17/03/2005, 15h26
  4. Est-il possible de détecter la modification d'un fichier ?
    Par Kokito dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 25/06/2004, 10h42
  5. [langage] Date de modification d'un fichier
    Par Cyspak dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2003, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo