【问题标题】:Error when accessing an Excel workbook from within a parallel loop从并行循环中访问 Excel 工作簿时出错
【发布时间】:2018-07-29 22:21:38
【问题描述】:

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

使用 xlswrite 时出错(第 226 行)

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

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

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

  • Excel 版本:2016

  • MATLAB 版本:R2017a

【问题讨论】:

  • 您正试图从多个工作人员同时打开(并写入)同一个文件...这将导致错误,原因与尝试手动执行此操作的原因相同
  • 谢谢狼!但是,我确定我使用的是 't = getCurrentTask(); t.ID;'确保每个工作人员只处理同一个文件。
  • 这正是我的观点,如果所有工作人员都在写入单个文件,那么您会遇到冲突,正如 Dev-iL 的回答中所述...这里真正的解决方案是在 MATLAB 中重写宏 -由于xlsreadxlswrite 的速度非常慢,因此这将加速很多次,在问题上抛出parfor 不是答案。
  • 再次感谢 Wolfie。我想我在上一条评论中犯了一个错字。在 parfor 内部的每个进程中,我使用 t = getCurrentTask(); t.ID;找出哪个工人正在处理这个过程。说 t.ID==2,然后是工人 2 工作,然后我让工人 2 使用文件 #2。
  • 我认为您关于更改宏的建议是一个很好的建议。这有点超出我的经验,但我会在有时间的时候尝试一下!再次感谢!

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


【解决方案1】:

这听起来像是一个典型的竞争条件问题,由需要独占访问同一文件的多个进程引起。基本思想是当另一个进程尝试打开文件时,一个进程仍未关闭文件,并且您只会收到错误有时,因为这些问题并不总是发生(另请参阅:Heisenbug) .

以下是一些关于您可以做什么的建议(按对我来说有意义的降序排列):

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

【讨论】:

  • 谢谢 Dev-iL。对于第一点,我认为它不会起作用,因为“xlswrite”步骤是我想用 parfor 加速的主要事情,所以它必须以原始方式。
  • 第二点,我需要在写完表格后重新评估表格这一事实会阻碍这个建议的工作。我会尝试第三个然后回来。再次感谢!
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多