Многопоточный расчет в Excel идет медленно - PullRequest
5 голосов
/ 28 марта 2012

Мне интересно, есть ли способ контролировать вычисления Excel, чтобы несколько листов в ББ пересчитывались параллельно, а другие нет. Моя проблема в том, что при текущей настройке процесс последовательного расчета, который у меня есть, занимает слишком много времени. Последовательность запускается из VBA и выглядит примерно так: 1) vba вызывает надстройку (надстройка excel-dna vb.net, которая управляет устройством чтения данных и прикрепленной базой данных) 2) addin возвращает данные на лист 1. Листы 2-3 пересчитываются в последовательности (лист 2, затем 3) 3) листы с 4 по 10 пересчитываются по порядку, но поскольку каждый из них независимо ссылается только на лист 2, теоретически они могут пересчитывать параллельно - верно? Но как это сделать? 4) начать процесс заново с вызова новых данных через vba addin, описанный в 1)

Выполнение подмножества данных на моем ноутбуке (64-битная с 32-битной Excel, Intel i7) занимает 54,6 секунды. Интересно, что если я отключу многопоточность, это займет 25,8 секунды! Более того, если я запускаю его на супербыстрой машине (2 x Intel Xeon X5570, четырехъядерная архитектура Nehalem, 64-битная с 64-битной Excel), это медленнее, чем у моего ноутбука, занимает 230 секунд с многопоточностью или 26 секунд без.

Интересно, есть ли способ лучше использовать несколько ядер и многопоточность. Медленный бит, кажется, лучше пересчитывает, чем скорость добавления. Любые предложения приветствуются.

редактирование: Вышеприведенное описание немного упрощает: на самом деле у меня также есть итеративный процесс calc / paste-vales / recalc, который выполняется на каждом из листов 4-10 (итерация продолжается до тех пор, пока не будет достигнута требуемая чувствительность, и только затем рассчитывается полный лист). Я полагаю, что это делает невозможным выполнение расчета wb при текущем дизайне.

Листы 4-10 идентичны (за исключением жестко заданных входных параметров) и не имеют расчетных зависимостей друг от друга. Если бы процесс вычисления (упомянутая процедура итерации и калькуляция листа) каждого из них мог бы быть выполнен параллельно, а не последовательно, я думаю, что весь процесс был бы намного быстрее.

К вашему сведению, я уже выполнил более очевидную оптимизацию и тестирование (разбиение формул, разделение изменчивых функций и т. Д.).

Выполнение всего набора данных в течение всего процесса занимает около 16 часов, поэтому я стремлюсь найти способы улучшить это.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 марта 2012
  • Вот отличное начало чтения о производительности вычислений в Excel: http://www.decisionmodels.com/calcsecretsc.htm.

  • Вы можете пометить функцию Excel-DNA как поточно-ориентированную, используя атрибут типа [ExcelFunction (IsThreadSafe = true)], хотя здесь это не похоже на узкое место. Это позволит одновременно выполнять эти функции.

  • Если ваш процессор i7 имеет гиперпоточность (поэтому он сообщает о 4 ядрах в Windows, но на самом деле имеет только два реальных ядра), то может быть быстрее установить число потоков в Excel в число ядер (скажем, 2) вместо числа потоков, которые может запустить процессор (это будет значение по умолчанию для Excel - возможно, 4).

1 голос
/ 28 марта 2012

Весьма необычно, когда многопоточные вычисления медленнее однопоточных.

Предположительно, вы перешли на вычисления вручную.

Используете ли вы Sheet.Calculate для каждого листа, чтобы"рассчитать листы по порядку"?Если это так, то, вероятно, было бы быстрее просто использовать Application.Calculate и позволить Excel автоматически найти самый быстрый способ пересчета всех листов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...