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