我想知道是否有任何方法可以控制excel计算,例如WB中的几张纸并行重新计算,而其他的不是。我的问题是,在目前的设置下,我的顺序计算过程耗时太长。这个序列是从VBA驱动的,如下所示: 1)vba调用一个插件(excel-dna vb.net插件,它控制数据读取器和附加数据库) 2)插件将数据返回到表格1。按顺序重新计算(第2页,然后是第3页) 3)第4页到第10页按顺序重新计算,但由于每个页面独立地只与页面2相连,所以理论上可以重新计算 - 但如何做到这一点? 4)再次通过1)中描述的通过vba插件调用新数据开始处理excel中的多线程计算很慢
在我的笔记本电脑上运行数据子集(64位,32位excel,英特尔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个小时,这就是为什么我想找到一些方法来改善这一点。
谢谢!
嗨戈弗特。这个excel-dna和dotnet datareader方面看起来非常有效。在任何情况下,我都会根据您的建议对数据子集运行微时间测试: 关闭多线程(28.3);在+ 1线程(30.3); + 2线程(70.8);所有可用的处理器(65.1)。切换IsExceptionSafe = True并且IsThreadSafe = True没有引起显着差异(错误和两者均为28.3sec)。我想知道,如果每个工作表的recalc命令是从excel-dna插件发送的,如果它可能以某种方式变得更快?例如vba运行excel-dna插件,然后发送sheet recalc命令。 – Yugmorf 2012-03-30 05:31:55
这里有一些最近关于Excel-DNA的性能讨论和结果:http://groups.google.com/group/exceldna/browse_frm/thread/e331337fcdc22a17。这似乎表明调用工作表通过COM和C API计算并没有什么区别。 – Govert 2012-03-30 07:48:21
谢谢。重新进行前面的讨论。我只注意到使用Threadsafe产生的结果:= True和多线程计算产生了虚假结果。我想我的应用程序是不是线程安全的... – Yugmorf 2012-03-30 09:44:25