速度非常慢()



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

除了使用dir(),还有什么快速而优雅的替代方案吗?

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

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

您正在使用哪个CPU/OS?我刚刚在我的机器上用一个有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函数的另一种选择是在MATLAB中直接使用Java的java.io.File

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

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

下面的foobar都生成相同的文件名单元数组(使用数据的MD5哈希进行验证),但使用Java的bar所花费的时间要少得多。如果我先生成bar,然后生成foo,也会看到类似的结果,所以这不是网络缓存现象。

>>tic;foo=dir('U:\mydir');foo={foo(3:end).name};toc运行时间为20.503934秒。>>tic;bar=cellf(@(f)char(f.toString()),java.io.File('U:\mydir').list())';toc运行时间为0.833696秒。>>DataHash(foo)ans=84c7b70ee60ca162f5bc0a061e731446>>DataHash(条形)ans=84c7b70ee60ca162f5bc0a061e731446

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

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

更新:

我查了一个目录,里面有4000多个文件。dirls都显示出相似的结果:大约0.34秒。我认为这还不错。(MATLAB 2011a,Windows 7 64位)

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

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

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)))

相关内容

  • 没有找到相关文章

最新更新