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

NodeJS Discussion :

Exploration récursive de répertoires en asynchrone


Sujet :

NodeJS

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Exploration récursive de répertoires en asynchrone
    Salut à tous !
    Oui, la solution est probablement quelque part sur l'internet si je cherche plus.
    Cela étant, après quand même quelques heures sur les deux(2) problèmes que je rencontre, je me tourne vers une communauté qui je l'espère saura m'aider.

    Je suis nouveau en node et je dois comparer des modules dont trois en node.js
    Je passe les détails mais ça sert à rechercher des extensions.

    Situation : j'ouvre un gros répertoire où je lis tous les fichiers, y compris ceux dans les sous-répertoires. Ensuite je fais passer les fichiers par ces fameux modules (n'hésitez pas à demander des détails si c'est nécessaire !) et tadam, ça m'affiche des trucs.

    Première interrogation :
    Je me suis rendu compte que les modules étant en asynchrone, quand je veux faire des stats (ce qui est intéressant pour comparer les modules), par exemple afficher combien de fichier ont été identifié, soit l'affichage se fait avant tout les calculs, ça m'affiche un joli 0 réussite, soit je mets l'affichage dans la partie analyse et ça me fait un affichage pour chaque fichier examiné.
    J'ai contourné le problème en écrivant les stats en write dans un fichier. Du coup ça le fait XX fois mais comme ça écrase les précédents, ça fonctionne.
    Mais existe-t-il une solution plus élégante ?

    Deuxième interrogation :
    Comme je le disais, je parcours un répertoire assez volumineux.
    Quand j'examine trop de fichier (12k), le terminal me retourne une erreur de type "Error: EMFILE: too many open files,".
    J'imagine que les modules ouvrent les fichiers pour inspecter le contenu et ... ne les ferment pas ? Ou alors c'est dû au caractère asynchrone, les fichiers sont ouverts plus vite qu'ils ne sont refermés ?

    J'ai regardé comment fermer les fichiers en node, mais en fait, comme je pense que c'est le module lui-même qui les ouvre, je ne vois pas trop où est-ce que je pourrais intervenir. Du coup, est-ce que vous avez une idée de comment réguler ça ? Ou où est-ce que je dois regarder pour trouver une solution ?

    Voilà, en espérant que vous pourrez m'aider : )

    EDIT : pour le premier problème, j'ai regardé si on pouvait mettre en synchrone (hérésie paraît-t-il), cherché comment mettre une sorte de barrière de synchronisation à la fin, testé avec des variables globales, placé mes lignes d'affichage partout où c'était possible de les mettre. Peut-être avec une fonction de callback ? Mais j'ai pas encore compris comment ça fonctionne.
    Pour le deuxième, comme je le disais j'ai regardé comment fermé et surtout ce qui était nécessaire pour le faire. J'ai aussi regardé si on peut limité le nombre de fichiers ouverts simultanément mais je n'ai pas trouvé.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Et sinon est-ce que tu envisages de montrer ton code à court ou moyen terme?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui en effet ça sera mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    var express = require("express");
    const modpath = require('path');
    var fs = require('fs');
    var detect = require('detect-file-type');
    var glob = require("glob");
    var recursive = require("recursive-readdir");
     
    let ts1 = Date.now();
    var comptSucces = 0;
    var size;
    //vérifie qu'il y a bien un chemin passé en paramètre
    if (process.argv.length <= 2) {
        console.log("Usage: " + __filename + " path/to/directory");
        process.exit(-1);
    }
     
    //place le chemin passé en paramètre dans la variable path
    var path = process.argv[2];
     
    recursive(path, function (err, items) {
      if (err) {
        console.log('Error', err);
      } else {
        var size = items.length;
        //console.log(items[0]);
        for(const file of items){
          detect.fromFile(file, function(err, result) {
            if (err) {
              return console.log(err);
            }
            if(result){
                comptSucces++;
                fs.writeFile('res_detect_file-Type.txt', ("guess "+comptSucces+" extensions out of "+size+"\ntakes "+(ts2-ts1)/1000+" secondes"), function (err) {
                  if (err) throw err;
                });
          });
     
          let ts2 = Date.now();
          console.log("takes "+(ts2-ts1)/1000+" secondes");
        }
      };
    });

Discussions similaires

  1. Besoin d'un peu d'aide sur les pointeurs.
    Par techz dans le forum Débuter
    Réponses: 9
    Dernier message: 18/04/2009, 16h32
  2. strcpy () besoin d'un peu d'aide
    Par Panaméen dans le forum C
    Réponses: 12
    Dernier message: 03/12/2007, 09h05
  3. Un peu d'aide sur une expression régulière particulier
    Par ruana dans le forum Général Python
    Réponses: 2
    Dernier message: 03/06/2007, 19h04
  4. besoin d'un peu d'aide
    Par etpaflechien dans le forum Langage
    Réponses: 1
    Dernier message: 13/04/2006, 10h38
  5. svp un peu d'aide sur mon update, resumé simple en dessous
    Par hansaplast dans le forum Langage SQL
    Réponses: 11
    Dernier message: 14/11/2005, 10h14

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