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

Scilab Discussion :

calcul statistique sur une importante quantité de données


Sujet :

Scilab

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Points : 12
    Points
    12
    Par défaut calcul statistique sur une importante quantité de données
    Bonjour,

    Pour un projet, je dois calculer le bruit dans une image 12 millions de pixel. Pour avoir une mesure représentative je dois acquérir 100 images que je dois traiter par la suite avec scilab. Ce qui nous fait 1,2 milliards de point à charger.

    Pour réduire le nombre de point à charger j'ai divisé cette image en 56 images de 384 x 512 pixel. Je dispose donc de 56 dossiers, contenant 100 fichiers de données enregistrés au format csv (séparateur = ","). J'ai choisit le format csv car je n'ai pas réussit à importer les données en format *.txt ...

    Le but du programme que j'ai implémenter est donc de parcourir les 56 dossiers, ouvrir les 100 fichiers. Je me retrouve donc avec une hypermatrice de dimensions (384 x 512 x 100).

    Ensuite, je calcul en chaque point la variance sur les 100 points. Le résultat est donc une matrice de variance de dimensions (384 x 512). Celle-ci est enregistrée dans un fichier *txt

    Voici mon problème :

    la quantité importante de données nécessite une utilisation importante de la mémoire de l'ordinateur.
    Le programme parvient à réaliser un tour de boucle, donc le traitement statiistique d'un dossier. Arrivé au second, une erreur d'allocation mémoire est renvoyée. Pour éxecuter à nouveau le programme il me faut redémarrer Scilab pour libérer la mémoire.

    J'aimerai pouvoir libérer la mémoire à la fin de la boucle pour ne pas avoir à intervenir pendant le traitement des 56 dossiers. Par l'utilisation de fonctions scilab (clear ne suffit pas avec l'utilisation que j'en fait). Si non par l'implémentation de fonction en C (malloc, halloc) que je ne connais pas très bien.

    Voici le code scilab que j'ai implenté

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    clc;
     
     
    clear all;
     
    //augmentation taille pile
    stacksize(10.1^8);
     
     
    nom_repertoire = "K:\"//modifier selon le repertoire à ouvrir
    dossier = input("Saisir le dossier dans lequel se trouve l"'""ensemble des données images :","string")
     
    nom_repertoire = nom_repertoire + dossier
    clear dossier;
     
    ListFolder = dir(nom_repertoire)//Liste le contenue du dossier
    FolderName = ListFolder(2) //Recupère le nom des dossiers
    [NbrFolder,x] = size(FolderName) // Recupère le nombre de dossiers
    clear x;
     
    for i = 1:1:NbrFolder   
     
        A = int(zeros(384,512,100)) // déclaration hypermatrice
        TargetFolder = nom_repertoire + "\" + FolderName(i)+'\dataImg_1\' // Construit le chemin où se trouve les fichiers data
        ListFile = dir(TargetFolder) // Liste le contenue du dossier
        FileName = ListFile(2) // Recupère le noms des fichiers
        clear ListFile
        [NbrFile,x] = size(FileName) // Recupère le nombre de fichiers (100)
        clear x;
     
        for i = 1:1:NbrFile
            A(:,:,i) = csvRead(TargetFolder + FileName(i),",") // Importe les données dans une hypermatrice
        end
     
     
     
        for r = 1 : 1 : 384 //nombre de lignes
            for c = 1 : 1 : 512 // nombre de colonnes
     
                a(1,:) =A(r,c,:) // vecteur qui contient les 100 valeurs aux coordonnées (r,c) 
                s(r,c)= variance(a,2)^2 // Calcul de la variance au carrée du vecteur
     
            end
        end
     
        fprintfMat(TargetFolder + "sCarreMat.txt",s,"%.2f") // Enregistre la matrice s dans un fichier txt
        clear TargetFolder;
        clear s;
        clear A;
        xpause(10000);
    end
     
    clear all;
     
    mprintf("\n*******************ANALYSE BRUIT TEMPO TERMINEE********************\n")

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    La ligne A = int(zeros(384,512,100)) n'a rien à faire dans la boucle.

    Tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A = zeros(384,512,100); // déclaration hypermatrice
     
    for i = 1:1:NbrFolder  
     
        ...
     
        A(:) = 0;
     
    end
    L'appel à int est également inutile.

    Pour finir, utilise la fonction fullfile pour créer les chemins complets des fichiers plutôt que l'opérateur de concaténation +
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Je vous remercie des conseils de programmation apportés.

    Toute fois, ces derniers ne règlent pas mon problème d'augmentation de la taille de la mémoire utilisée à chaque tour de boucle.

    Comment libérer la mémoire (comme si je redémarrai scilab) à la fin de chaque boucle (NbrFolder) ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Je ne vois pas pourquoi Scilab aurait besoin de plus de mémoire à chaque itération.

    Peux-tu essayer le code suivant et nous dire si le problème persiste avec ?

    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
    stacksize(10.1^8);
     
    A = zeros(384,512,100);
     
    NbrFolder = 50;
    NbrFile = 100;
     
    for i = 1:NbrFolder 
     
        disp(i)
     
        for n = 1:1:NbrFile
            A(:,:,n) = rand(384,512);
        end
     
        fprintfMat("test.txt",A(:,:,1),"%.2f");
     
        A(:) = 0;
     
    end
    Et peux-tu aussi nous montrer le message d'erreur renvoyer par Scilab, et nous dire la version que tu utilises et sur quel système d'exploitation tu travailles ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    J'ai testé le code que vous m'avez donné et il fonctionne bien.

    Lorsque j'execute mon code, l'ordinateur utilise 92% de la memoire pour extraire les donnees du premier dossier

    Au tour de boucle suivant (2iem dossier) erreur
    :

    A(:,:,j)=csvRead("fichier data") !-- error 999
    csvRead : Erreur d'allocation mémoire
    Pour Scilab j'utilise la version 5.4.0

    OS = windows 7 pro 64 bit
    Processeur = Intel core i3 3,30 GHz

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Essaie en mettant :

    à la place de

    Tu peux aussi essayer en utilisant la toolbox csv_readwrite disponible avec ATOMS.

    Le bug avait semble-t-il été rapporté à ce sujet : Ticket 502 : memory error using csv_read
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos conseils,

    Puisque le problème semblait venir de la lecture du format .csv, j'utilise des fichiers .txt pour stocker mes données.

    Je n'ai plus d'erreur d'allocation mémoire.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Le module "csv_readwrite" a été intégré (et amélioré) dans Scilab 5.4.0 (et la 5.4.1 corrige pas mal de bugs sur cette fonction).

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par grayswandir Voir le message
    dans Scilab 5.4.0
    C'est la version utilisée par pokie
    Citation Envoyé par grayswandir Voir le message
    (et la 5.4.1 corrige pas mal de bugs sur cette fonction).
    @pokie : il serait intéressant de faire la mise à jour vers la 5.4.1 pour voir si le problème est résolu avec cette version
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par pokie Voir le message
    Pour Scilab j'utilise la version 5.4.0
    D'autre part, la fonction variance a été améliorée dans la dernière version 5.4.1, tu devrais peut être faire la mise à jour ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

Discussions similaires

  1. Réponses: 26
    Dernier message: 25/10/2013, 14h57
  2. Une grande quantité de données sur Oracle 8i?
    Par bliml dans le forum Oracle
    Réponses: 13
    Dernier message: 01/03/2007, 11h45
  3. statistiques sur les appels à base de données
    Par garfieldcut dans le forum JDBC
    Réponses: 2
    Dernier message: 27/12/2006, 10h52
  4. Statistique sur une table
    Par Andry dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/05/2006, 08h47
  5. [VBA-E] calculs automatique sur une seule feuille
    Par repié dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2006, 11h53

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