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

VB.NET Discussion :

Copier rapidement une plage de données


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Par défaut Copier rapidement une plage de données
    Bonjour à tous et à toutes !
    Voilà mon problème :

    Je travaille sur un Sub générique qui est chargé de copier une série d'éléments contigus d'un tableau dans un autre. Le but est de m'en servir pour implémenter des algorithmes de tri efficaces.

    La signature de ce sub est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Copier(Of T)( _
    Source as T(), IndexSource as Integer, _
    Cible as T(), IndexCible as Integer, _
    Longueur as Integer)
    Source : tableau d'où proviennent les éléments ;
    IndexSource : index du premier élément à copier ;
    Cible : tableau où recopier les éléments ;
    IndexCible : indice où recopier le premier élément ;
    Longueur : nombre d'éléments à copier.

    J'ai pensé à plusieurs méthodes :

    • Effectuer une copie élément par élément, avec une boucle For ;
    • Utiliser la méthode Array.Sort(), qui répond à mes attentes ;
    • Effectuer une copie grâce à la classe System.Runtime.InteropServices.Marshal.


    J'ai testé les deux premières méthodes, avec une rapidité d'exécution supérieure pour la deuxième.

    Ma priorité est la rapidité (et pas la simplicité du code). De plus, ce Sub étant destiné à être appelé de très nombreuses fois, un gain de temps minime serait déjà le bienvenu ! Je pense donc que la troisième méthode serait encore meilleure.

    Mais la méthode Copy() de la classe Marshal permet de copier un tableau à l'adresse spécifiée par un pointeur, ou les informations trouvées à l'adresse d'un pointeur dans un tableau, mais pas un tableau dans un autre tableau.

    Quelqu'un a-t-il une idée me permettant d'utiliser, dans ma situation, les performances de la fonction Copy() ?

    Merci à vous !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 200
    Par défaut
    à la description de ce que tu dis au début, je ne vois le rapport avec le sort vu que tu parles d'une copie en bloc
    et il y a une méthode sur le framework 3 ou 3.5 qui fait ca (array.copy(source, cible, débutsource, débutcible, longueur))

    sinon tu dois pouvoir tenter de réinventer ca en multithreading ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Par défaut
    Pol63, merci pour ta réponse !

    Comme je l'indique dans mon message, j'utilise la copie en bloc à l'intérieur d'une routine de tri, et Array.Copy(), que j'ai essayée, ne paraît pas encore assez efficace dans mon cas. D'où la recherche d'une méthode plus rapide...

    En revanche, l'idée du multi-thread me semble excellente, car parfaitement adaptée à mon algorithme de tri. J'essaie ça tout de suite et je reviens !

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 200
    Par défaut
    l'algo de tri, qui doit etre celui implémenté dans .sort est connu
    en réinventer un en multithreading et plus performant n'est pas forcément aisé je pense
    je partirais sur un découpage du tableau en x parties, x étant le nombre de core
    un sort par petit morceau
    et au final on recréer un tableau en lisant les 1ères valeurs de chaque tableau pour trouver la plus petite et on dépile ce tableau (ou on retient l'index)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Par défaut
    Pol63, je tiens compte de tes diverses propositions ! Je reviendrai pour rendre compte des solutions retenues au final.

    Merci !

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Par défaut
    Je reviens pour confirmer qu'utiliser le multi-threading pour effectuer un tri est une excellente idée ! Pour ma part j'obtiens une routine générique qui fait le même travail que Array.Sort(), asymptotiquement en quatre fois moins de temps !!! Donc tout cela en valait largement la peine.

    Précision : pour moi, inutile de découper mon tableau en paquets avant d'appliquer mon algo à chaque paquet, puisque mon algorithme de tri consiste justement en un diviser pour régner. Donc dans ma fonction de tri récursive, je passe en argument la profondeur de récursion actuelle (1 pour l'appel sur le tableau entier, 2 pour les deux moitiés, 3 pour les quatre quarts, etc.) Ensuite, si la profondeur est petite ( <= 3 pour une machine ayant 2^3 processeurs) je lance le diviser pour régner sur deux Threads, sinon sur le même. On a alors une utilisation optimale des processeurs (si leur nombre est une puissance de 2, ce qui est toujours le cas j'imagine ??)

    Grand merci à Pol63 !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/07/2013, 09h36
  2. [XL-2010] Copier une plage de données d'un classeur excel X a un classeur excel Y
    Par CmsrFr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/05/2012, 19h00
  3. [OpenOffice][Tableur] [Macro] Comment copier une plage de données d'une Feuille "A" vers la Feuille Active
    Par clduick dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 03/02/2012, 11h39
  4. Copier une plage de données vers un onglet d'un autre document
    Par morgane07 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/04/2010, 15h59
  5. copier une plage de donnée d'un fichier à un autre
    Par kristoch91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/10/2008, 10h26

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