【问题标题】:How can I increase the speed of this xlsread for loop?如何提高这个 xlsread for 循环的速度?
【发布时间】:2017-06-28 03:34:26
【问题描述】:

我制作了一个脚本,其中包含一个 for 循环,从 533 个不同的 excel 文件中选择列并将它们放入矩阵中以便进行比较,但是该过程花费的时间太长(它昨天运行了 3 个小时并且没有甚至一半!)。

我知道 xlsread 自然很慢,但是有谁知道如何让我的脚本运行得更快?脚本如下,谢谢!!

%Split the data into g's and h's
CRNum = 533; %Number of Carrington Rotation files
A(:,1) = xlsread('CR1643.xlsx','A:A'); % Set harmonic coefficient columns
A(:,2) = xlsread('CR1643.xlsx','B:B');
B(:,1) = xlsread('CR1643.xlsx','A:A');
B(:,2) = xlsread('CR1643.xlsx','B:B');

for k = 1:CRNum
    textFileName = ['CR' num2str(k+1642) '.xlsx'];
A(:,k+2) = xlsread(textFileName,'C:C'); %for g
B(:,k+2) = xlsread(textFileName,'D:D'); %for h
end

【问题讨论】:

  • 也许您可以将多个文件合并为一个文件,然后从其中的不同工作表中读取。在这种情况下,您只需要“打开文件进行阅读”一次。请参阅xlsread1 了解为什么它会更好。
  • 真正需要多快?如果你让它昨天运行它可能现在已经完成了。 (如果您选择这样做,您可能希望随时打印进度。)
  • 我想它不必非常快,但是昨天我在我的笔记本电脑上运行它,它开始过热(这是一台糟糕的笔记本电脑),所以我决定在大学里运行它今天的校园电脑速度更快!!我如何打印进度?
  • 我也去看看 xlsread1 谢谢!!
  • 这里打印进度最简单的方法:在循环中,只需删除textFileName = ['CR' num2str(k+1642) '.xlsx']之后的分号,或者您可以只打印k。

标签: matlab for-loop xlsread


【解决方案1】:

如果您想通过循环,请不要使用xlsread。因为每次调用它都会打开excel,然后关闭excel服务器,这很耗时。而是在循环之前使用actxserver 打开excel,做你想做的事,最后在循环之后关闭actxserver。有关使用 actxserver 的良好示例,请在 MATLAB 帮助中搜索“使用 Excel 作为自动化服务器读取电子表格数据”。

还可以看看readtable,它比xlsread 运行得更快,但会生成一个表格。

【讨论】:

  • 在 MATLAB 帮助中找到一个包含基本命令的简单示例:de.mathworks.com/help/matlab/matlab_external/…
  • 如果您在 linux 机器上运行 MATLAB,则必须使用 Apache POI 库将数据写入 excel 工作簿。文件交换的以下功能为您提供有关工作流程的概述:mathworks.com/matlabcentral/fileexchange/…
  • 现在无法尝试,但这让我想到使用 num = xlsread(filename,sheet,xlRange,'basic') 也可能会影响性能,因为它不会调用 Excel。
【解决方案2】:

最明显的改进似乎是尽可能只加载部分文件。但是,如果这不是一个选项,请尝试仅打开每个文件一次是否有帮助(读取您需要的所有内容,然后分配它)。

M(:,k+2) = xlsread(textFileName,'C:D');

还要检查你每次读了多少,如果你在第一个文件中读了很多行,你可能把A的第一个维度变大,然后你每次读一个文件都会填满?

另外:一开始可以找到一个小而简单的改进。不要使用 4 个 load 语句,而是使用 1 个,然后根据结果分配变量。

【讨论】:

  • 所以你的意思是这样的? ` for k = 1:CRNum` ` textFileName = ['CR' num2str(k+1642) '.xlsx']; ` ` C = xlsread(textFileName,'C:D'); ` ` A(:,k+2) = C(:,1); ` ` B(:,k+2) = C(:,2); `end每次向A添加列时读取55行
  • 正如您提到的上大学,如果您可以访问多台计算机上的文件,这项工作很容易并行化。第一台计算机为k=1:100 构建矩阵,接下来为k=101:200 等构建矩阵
  • @RThompson 这确实是我的想法。只需尝试几个文件,看看它是否有帮助。如果它仍然很慢,请分析您的代码并查看时间在哪里。如果它仍然主要是对xlsread 的调用,我认为你不能对这里的逻辑做太多其他事情。那你可以试试xlsread1是否有帮助。 -- 现在有点晚了,但如果你昨天运行了 3 个小时,你可以把结果保存下来,今天再拿起 3 个小时!
  • 按照您上面提到的操作并打印该过程现在似乎每个 k 需要 6 秒,所以我相信这应该立即完成,谢谢!!
  • 总共大约 53 分钟,但仍然相当快!!
【解决方案3】:

如this post 中所述,最简单的更改是将“基本”设置为真。这会禁用 Excel 中的公式和宏等内容,并允许您更快地阅读简单的表格。例如,您可以使用:

xlsread('CR1643.xlsx','A:A', 'Basic', true)

当我在 11,000 x 7 Excel 表格上进行测试时,这导致加载时间从大约 22 秒减少到大约 1 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多