在MATLAB中,使用exist(x,'file')会花费很长时间。

13

我正在使用 exist(x, 'file') 函数来检查我的电脑上是否存在某个文件。但是每次运行这个命令都需要很长时间(每次调用超过10秒!)。

我的 matlabpath 不太长(大约有200个条目),并且路径上的所有文件夹都在本地驱动器上(没有网络)。

  1. 为什么 exist 函数需要这么长时间?
  2. 有没有办法让它运行更快?

PS,
这个对 exist 函数的调用是 Matlab 执行 loadlibrary 命令的一部分。所以,如果你调用了 loadlibrary 命令,而你不知道为什么它需要花费很长时间,那么这个问题也适用于你。


2
只是出于好奇,x的值是多少? - Eitan T
不算是答案,但如果你可以下载existfile它可能会解决这个问题:http://www.mathworks.co.uk/matlabcentral/fileexchange/13775-multicore-parallel-processing-on-multiple-cores/content/existfile.m - devrobf
@jazzbassrob 很抱歉,exist 是我无法更改的代码的一部分。因此 existfile 解决方案对我不适用。但还是谢谢你。 - Shai
1
"exist"函数在Matlab中访问文件速度较慢,导致运行时间很长。我发现唯一加快它运行速度的方法是替换它(例如,检查目录时,我使用一个尝试“cd”的函数代替)。 - Jonas
2
200个路径条目听起来有点多。你用的是什么操作系统?例如,在Windows上,您可以使用Sysinternals的Process Monitor跟踪程序的系统调用以查看它正在做什么。它将显示所有文件访问及其持续时间,这可能会给您一些线索。 - Andrew Janke
显示剩余8条评论
4个回答

21

这里有一个建议。你可以将包含这些头文件的目录放在MATLAB路径的前面,这样当exist()浏览路径时,它会很快找到它们,而不必搜索其余的条目。 如果它花时间浏览你的路径,那么这可能会有所帮助。


我一定会尝试的! - Shai
如果你在使用Windows系统,也可以尝试使用procmon工具。我怀疑你可能遇到了Change Notification Handle的限制。即使它们都是本地目录,由于数量太多,仍然可能会出现问题。 - Andrew Janke
感谢您的指导和建议。我终于解决了问题——%TEMP%文件夹中有太多文件了……您的建议非常有帮助。 - Shai
6
另一个+1来自http://meta.stackexchange.com/questions/179409/how-can-i-award-a-user-with-reputation-apart-from-trivial-upvoting-accept. - Andrew Cheong
1
@AndrewJanke,希望现在说“谢谢”不算太晚了 :) - Shai
@Shai 永远不会太晚。感谢你的感谢,希望这对你的工作有所帮助。 :) - Andrew Janke

18

哇!那真是一件棘手的事情。底线: 删除%TEMP%文件!

我发现我电脑里有几千个文件散落在%TEMP%目录中。看来MATLAB非常喜欢不停地访问TEMP目录。

清理TEMP目录后,exist瞬间运行!

(感谢Andrew提供的Process Monitor建议!)


1
  1. exist是Matlab中的内置函数。它被设计用来检查其他类型的对象(如Matlab中的变量)以及文件的存在性。作为内置函数,它的代码不是很简单。至少在Windows上,当你调用exist('filename','file')时,它似乎只会向操作系统发出一次API调用来检查文件是否存在。所以要么是操作系统花费了很长时间,要么是exist函数中存在一些臃肿使得它运行缓慢。参见其他帖子中的解决方案,以获取有关如何使操作系统更快地返回其结果的思路。

  2. 有时人们抱怨在循环中运行exist('filename','file')会使循环非常缓慢,这是因为每次调用需要几毫秒,并且循环执行了几千次。在这里的解决方案是用以下代码替换:

    if exist('filename','file')   
      % your code

使用以下代码:

    if java.io.File('filename').exists
      % your code

使用Java API来完成这个任务是一个有趣的方法。您能否确认(例如,使用分析器)Java方法确实更快? - Shai

0

对于372个文件 Matlab: 耗时40.207266秒。(去泡一杯茶) Java: 耗时0.122165秒。(眨眼间)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接