3

当文件很多时,大约 4000 个,dir()功能很慢。我的猜测是它创建了一个结构并以低效的方式填充值。

是否有任何快速而优雅的替代方法dir()

更新:在 64 位、Windows 7 中使用 MATLAB R2011a 对其进行测试。

更新 2:完成大约需要 2 秒。

4

4 回答 4

8

您使用的是哪个 CPU/操作系统?我刚刚在我的机器上尝试了一个包含 5000 个文件的目录,而且速度非常快:

>> d=dir;
>> tic; d=dir; toc;
Elapsed time is 0.062197 seconds.
>> tic; d=ls; toc;
Elapsed time is 0.139762 seconds.
>> tic; d=dir; toc;
Elapsed time is 0.058590 seconds.
>> tic; d=ls; toc;
Elapsed time is 0.063663 seconds.
>> length(d)

ans =

        5002

MATLAB 的 ls 和 dir 函数的另一种替代方法是java.io.File在 MATLAB 中直接使用 Java:

>> f0=java.io.File('.');
>> tic; x=f0.listFiles(); toc;
Elapsed time is 0.006441 seconds.
>> length(x)

ans =

        5000
于 2011-06-17T13:16:14.167 回答
7

确认 Jason S 关于网络驱动器和包含 363 个文件的目录的建议。Win7 64 位 Matlab 2011a。

两者foobar以下都产生相同的文件名元胞数组(使用数据的 MD5 散列验证),但bar使用 Java 花费的时间要少得多。bar如果我先生成然后再生成类似的结果foo,所以这不是网络缓存现象。

>> 抽动;foo=dir('U:\mydir'); foo={foo(3:end).name}; 目录
经过的时间是 20.503934 秒。
>> tic;bar=cellf(@(f) char(f.toString()), java.io.File('U:\mydir').list())';toc
经过的时间是 0.833696 秒。
>> 数据哈希(foo)
答案=
84c7b70ee60ca162f5bc0a061e731446
>> 数据哈希(bar)
答案=
84c7b70ee60ca162f5bc0a061e731446

哪里cellf = @(fun, arr) cellfun(fun, num2cell(arr), 'uniformoutput',0);DataHash来自http://www.mathworks.com/matlabcentral/fileexchange/31272。我跳过返回的数组的前两个元素,dir因为它们对应于...

于 2012-02-29T19:25:08.323 回答
1

%示例:列出文件和文件夹

Folder = 'C:\'; %can be a relative path
jFile = java.io.File(Folder); %java file object
Names_Only = cellstr(char(jFile.list)) %cellstr
Full_Paths = arrayfun(@char,jFile.listFiles,'un',0) %cellstr

%示例:列出文件(跳过文件夹)

Folder = 'C:\';
jFile = java.io.File(Folder); %java file object
jPaths = jFile.listFiles; %java.io.File objects
jNames = jFile.list; %java.lang.String objects
isFolder = arrayfun(@isDirectory,jPaths); %boolean
File_Names_Only = cellstr(char(jNames(~isFolder))) %cellstr

%示例:简单过滤器

Folder = 'C:\';
jFile = java.io.File(Folder); %java file object
jNames = jFile.list; %java string objects
Match = arrayfun(@(f)f.startsWith('page')&f.endsWith('.sys'),jNames); %boolean
cellstr(char(jNames(Match))) %cellstr

%示例:列出所有类方法

methods(handle(jPaths(1)))
methods(handle(jNames(1)))
于 2013-08-22T17:42:03.477 回答
1

你可以试试LS。它只返回字符数组中的文件名。我没有测试它是否比 DIR 快。

更新:

我检查了一个包含 4000 多个文件的目录。两者都dir显示ls相似的结果:大约 0.34 秒。我认为这还不错。(MATLAB 2011a,Windows 7 64 位)

您的目录是否位于本地硬盘驱动器或网络上?对硬盘进行碎片整理可能会有所帮助吗?

于 2011-06-17T12:40:21.007 回答