cptCarPcs.py

text/x-python cptCarPcs.py — 4.3 KB

Contenu du fichier

#!/usr/bin/env python

#  cptCharPcs.py
#-------------------
# Ce programme l'occurence de certains caractères dans un texte à l'aide de fils d'exécution
#
# Paramètres sur la ligne de commandes
#  - Parm #1 : nombre de processus à utiliser
#  - Parm #2 : nom du fichier contenant le texte
#  - Parm #3 : nom du fichier de sortie

from multiprocessing import Process, Value, Array
from multiprocessing import Semaphore
import time
from datetime import datetime
import sys

#----------------------------------------------------------------------
# decompte 
# 
# fonction qui  effectue le decompte des caractères
#
# Entrée : index - identifiant du fil
#          depart - indice début de la suite de caractères à traiter
#          fin - indice fin de la suite de caratères à traiter
#          texte - texte à traiter
#          alpha  - caractères à compter
# Sortie : nbCar : variable modifiée par chaque fil
#
# ********************************************************
# *** Insérer le code de votre fonction ici **************
#********************************************************* 
def decompte(index, depart, fin, texte,alpha, nbCar):









#********************************************************************************
#   Programme principale qui initialise et démarre les fils
#   
#   Entree : (sur la ligne de commandes)
#            nbPcs - nombre de fils d'exécution
#            nom : fichier contenant le texte
#            nom_sortie : fichier contenat le résultat
#    
#********************************************************************************          
if __name__=="__main__":

    carParPcs= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    nbCar = Array('i', 63)

    # Obtention des paramètres
    nbPcs = eval(sys.argv[1])     # nombre de pcs d'exécution
    nom = str(sys.argv[2])        # nom du fichier contenant le texte
    nom_sortie = str(sys.argv[3]) # nom du fichier cntenant les résultats
    #--------------------------------
    # ***** Affichage pour mise au point
    print(nbPcs, " --- " , nom, " -- ", nom_sortie)
    #------------------------------------
    #Lecture du texte    
    f = open(nom, mode = "r", encoding="latin-1")
    texte = f.read()   
    #--------------------------------------------
    # Détermination de la taille du texte à traiter par chaque pcs
    # --------------------------------------------------------
    taille1 = int(62 / nbPcs)
    taille2 = int(62 % nbPcs)
    carParPcs[0]=0
    # Répartition du «reste» du texte entre les processus
    for j in range(1, nbPcs+1):
        if (taille2 > 0):
            carParPcs[j] = carParPcs[j-1] + taille1 + 1;
            taille2 = taille2 -1
        else :
            carParPcs[j] = carParPcs[j-1] + taille1
    #---------------------------------------------------------
    # Positionnement du chronomètre pour évaluer la performance
    debut = datetime.now()
    #-------------------------------------------------
    # Initialisation et démarrage des fils d'exécution
    processus = [Process(target=decompte, args = (n, carParPcs[n], carParPcs[n+1]-1, texte, alpha, nbCar)) for n in range(0, nbPcs)]
    for p in processus : p.start()
    #-------------------------------------------------
    # Attente de la fin de tous les fils
    for p in processus : p.join()
    #-------------------------------------------------
    # Arrêt du chronomètre
    fin = datetime.now()
    # -------------------------------------------------
    # Affichage du temps d'exécution
    delta = fin -debut
    print("Temps d'exécution en secondes = ", delta.total_seconds())
    # -------------------------------------------------
    # Sauvegarde du résultat dans fichier de sortie
    f = open(nom_sortie, mode = "w", encoding="utf-8")
    f.write("Occurences des caractères dans le texte : \n")
    for i in range(0,62):
        if ((i+1)%12 ==0):
            f.write("(")
            f.write(alpha[i])
            f.write(":")
            f.write(str(nbCar[i]))
            f.write(")\n")
        else:
            f.write("(")
            f.write(alpha[i])
            f.write(":")
            f.write(str(nbCar[i]))
            f.write("),")