从并行循环访问Excel工作簿时出错

时间:2018-07-29 22:21:38

标签: excel matlab parallel-processing activex file-access

我正在使用MATLAB写入其中包含宏的Excel文件,然后重新评估该文件并使用xlsread提取宏结果。该代码仅适用于一名工人。但是,如果我使用parfor并使用第二个工作程序,MATLAB会给出如下错误消息。为严格起见,我为第二个工作人员创建了第二个Excel文件,并使用t = getCurrentTask(); t.ID;指示工作人员处理他们安排的excel文件。

  

使用xlswrite时出错(第226行)

     

调用错误,调度异常:   资料来源:Microsoft Excel   说明:Microsoft Excel无法访问该文件   'C:\ Users ----- \ D0481000'。有几种   可能的原因:   •文件名或路径不存在。   •该文件正在被另一个程序使用。   •您要保存的工作簿与当前打开的工作簿具有相同的名称。   帮助文件:xlmain11.chm   帮助上下文ID:0

     

extractFromExcelExpress中的错误(第249行)      xlswrite(filename,writeIn,sheet,'B23');

这是随机发生的。我确实尝试过更改excel文件的文件夹,它开始工作了几个小时,但最终停止了。我确实清除了Excel中的所有加载项,并且确实将相应的文件夹放在excel信任位置。

  • Excel版本:2016

  • MATLAB版本:R2017a

1 个答案:

答案 0 :(得分:0)

这听起来像是典型的竞争状况问题,由多个进程需要互斥访问同一文件引起。基本思想是,当另一个进程试图打开该文件时,一个进程仍未关闭文件,并且您有时会出现错误,因为这些问题并不总是会发生(另请参见:{{3} }。

以下是关于您可以做什么的一些建议(以对我有意义的顺序递减):

  • 尝试重新设计代码,使得一次只能有一个进程访问(读取 OR 写入)文件。这称为“ Heisenbug”。在MATLAB中实现此目的最简单的方法是将xlswrite代码放在parfor之外。如果在保留parfor的同时很难实现这一点,只需将所有中间结果保存到工作区变量中,然后在完成计算后将其写入磁盘。
  • 您可以使用与critical section中相同的方法在进程之间共享ActiveX对象(我从未尝试过,并且不能肯定地说这是可能的)。从本质上讲,它不会尝试在两次写入之间打开和关闭文件,因此,一个进程仍然没有关闭它的情况就不会发生,而另一个进程却试图打开它。
  • 找到一种使用xlswrite1属性的方法。这可能与先前的建议有关。
  • 使用最快的存储空间。您可以使用Workbook.MultiUserEditing,然后将Excel文件放在此处,这样至少可以避免由于使用网络驱动器,HDD甚至是SSD而导致的速度变慢。
  • 如果所有其他方法均失败,请在xlswrite语句前后加上while true, try, xlswrite(...); break; catch, pause(0.01); end, end。这 会降低代码速度,但至少最终会完成代码。