當文件很多時,4000左右,dir()
函數很慢。我的猜測是它創建了一個結構並以低效的方式填充了值。很慢dir()
是否有任何快速而優雅的替代品使用dir()
?
更新:使用MATLAB R2011a在64位Windows 7中進行測試。
更新2:大約需要2秒鐘才能完成。
當文件很多時,4000左右,dir()
函數很慢。我的猜測是它創建了一個結構並以低效的方式填充了值。很慢dir()
是否有任何快速而優雅的替代品使用dir()
?
更新:使用MATLAB R2011a在64位Windows 7中進行測試。
更新2:大約需要2秒鐘才能完成。
您可以試試LS。它只返回字符數組中的文件名。我沒有測試它是否比DIR更快。
更新:
我檢查了超過4000個文件的目錄。 dir
和ls
都顯示類似的結果:約0.34秒。我認爲這並不壞。 (MATLAB 2011a,Windows 7 64位)
您的目錄位於本地硬盤驅動器或網絡上嗎?可能對硬盤進行碎片整理將有所幫助?
您正在使用哪種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功能是直接使用Java的java.io.File
在MATLAB:
>> 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。
foo
和bar
都會產生相同的文件名單元陣列(使用數據的MD5散列驗證),但使用Java的bar
需要的時間要少得多。如果我先生成bar
,然後foo
生成類似的結果,那麼這不是網絡緩存現象。
>> tic; foo=dir('U:\mydir'); foo={foo(3:end).name}; toc Elapsed time is 20.503934 seconds. >> tic;bar=cellf(@(f) char(f.toString()), java.io.File('U:\mydir').list())';toc Elapsed time is 0.833696 seconds. >> DataHash(foo) ans = 84c7b70ee60ca162f5bc0a061e731446 >> DataHash(bar) ans = 84c7b70ee60ca162f5bc0a061e731446
其中cellf = @(fun, arr) cellfun(fun, num2cell(arr), 'uniformoutput',0);
和DataHash
爲http://www.mathworks.com/matlabcentral/fileexchange/31272。我跳過由dir
返回的數組中前兩個元素,因爲它們對應於.
和..
。
%實施例:列表文件和文件夾
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)))
使用掩碼僅列出您想要的文件dir * data * .m`,例如 – jonsca 2011-06-17 12:22:10
@jonsca:我需要目錄中的所有文件,所以我需要所有〜4000個文件名。 – nimcap 2011-06-17 12:29:27