Multithread de calcul dans excel est lent
Je me demandais si il existe un moyen de contrôle de calcul excel de telle sorte que plusieurs feuilles dans un WB sont recalculés en parallèle, tandis que les autres ne sont pas. Mon problème est que dans l'architecture actuelle, la séquence du processus de calcul que j'ai est trop long. La séquence est piloté à partir de VBA et va quelque chose comme ceci:
1) vba appelle un addin (excel-l'adn vb.net addin, qui contrôle un datareader et attachés de base de données)
2) addin renvoie les données de la feuille 1. Feuilles 2-3 sont recalculés en séquence (feuille 2, puis 3)
3) les feuilles de 4 à 10 sont recalculées dans l'ordre, mais étant donné que chaque indépendamment des liens uniquement vers la feuille 2, ils pourraient, en théorie, de recalculer en parallèle - droit? Mais comment faire cela?
4) commencer le processus avec l'appel de nouvelles données via vba addin décrite dans la section 1)
De l'exécution d'un sous-ensemble de données sur mon ordinateur portable (64 bits avec 32 bits d'excel, intel i7), il prend de 54,6 secondes. Fait intéressant, si j'éteins le multithreading, il prend de 25,8 secondes! De plus si je le lance sur une super machine rapide (2 x Intel Xeon X5570, quad-core “Nehalem” de l'architecture, de 64 bits avec 64 bits d'excel), il est plus lent que mon ordinateur portable, prise de 230seconds avec le multithreading ou 26 secondes sans.
Je me demande si il ya une meilleure façon que je pourrais faire de l'utilisation de processeurs multi-cœurs et le multithreading. La lenteur de bits s'affiche à nouveau calcul excel plutôt que le complément de la vitesse. Toutes les suggestions apprécié.
edit:
La description ci-dessus est un peu de simplification, Dans la réalité, j'ai aussi un processus itératif 'calc/coller-vallées/recalcul' processus qui s'exécute sur chacune des feuilles de 4 à 10 (l'itération produit jusqu'à ce que certains sensibilité requise est atteinte, et alors seulement, est la feuille de calcul). Je crois que ce qui fait courir un wb calculer sous la forme actuelle impraticable.
Feuilles de 4 à 10 sont identiques (sauf pour les codée en dur paramètres d'entrée) et n'ont pas de calcul des dépendances entre les l'un de l'autre. Si le processus de calcul (mentionné procédure d'itération et de la feuille calc) de chacun d'entre eux pourrait être fait en parallèle au lieu de séquentiellement, je pense que tout le processus serait beaucoup plus rapide.
Pour info, j'ai déjà effectué le plus évident de la rationalisation et de l'essai (rupture de formules, en séparant les fonctions volatiles, etc).
L'exécution de l'ensemble de mon jeu de données à travers le processus tel qu'il est, prend environ 16 heures, c'est pourquoi je suis désireux de trouver quelques moyens pour améliorer cette situation.
Merci!
Vous devez vous connecter pour publier un commentaire.
Voici un excellent point de départ pour la lecture sur Excel de calcul de la performance: http://www.decisionmodels.com/calcsecretsc.htm.
Vous pouvez marquer une Excel-l'ADN de la fonction en tant que thread-safe à l'aide d'un attribut comme [ExcelFunction(IsThreadSafe=true)], bien que cela ne ressemble pas à le goulet d'étranglement ici. Qui permettra ces fonctions pour être évalués simultanément.
Si votre processeur i7 a la technologie hyper-threading (donc des rapports de 4 coeurs de Windows, mais a fait que deux véritables noyaux), alors il peut être plus rapide pour régler le Excel nombre de threads pour le nombre de cœurs (disons 2) au lieu du nombre de threads que le processeur peut exécuter (ce qui serait le Excel par défaut - peut-être 4).
Son très inhabituel pour le multi-thread de calcul pour être plus lent qu'un seul thread de calcul.
Sans doute vous avez mis en calcul Manuel.
Êtes-vous à l'aide de la Feuille.Calculer sur chaque feuille "de calculer les feuilles de calcul dans la séquence"? Si oui, il serait probablement plus rapide de l'utilisation de l'Application.Calculer et laissez Excel automatiquement de travail de la façon la plus rapide de recalculer toutes les feuilles.