Очень медленный реж () - PullRequest
3 голосов
/ 17 июня 2011

Когда файлов много, около 4000, функция dir() работает очень медленно.Я предполагаю, что он создает структуру и заполняет значения неэффективным способом.

Существуют ли быстрые и элегантные альтернативы использованию dir()?

Обновление: тестирование в 64-битной версии,Windows 7 с MATLAB R2011a.

Обновление 2: для завершения требуется около 2 секунд.

Ответы [ 4 ]

8 голосов
/ 17 июня 2011

Какой процессор / ОС вы используете? Я только попробовал это на моей машине с каталогом с 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
6 голосов
/ 29 февраля 2012

Подтверждено предложение Джейсона С. для сетевого диска и для каталога, содержащего 363 файла.Win7 64-bit Matlab 2011a.

И foo, и bar ниже приводят к одному и тому же массиву ячеек имен файлов (проверено с помощью хеширования данных MD5), но bar с использованием Java занимает значительно меньше времени.Аналогичные результаты можно увидеть, если я сначала сгенерирую 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, поскольку они соответствуют . и ...

1 голос
/ 22 августа 2013

% Пример: список файлов и папок

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)))
1 голос
/ 17 июня 2011

Вы можете попробовать LS . Возвращает только имена файлов в массиве символов. Я не проверял, работает ли он быстрее DIR.

UPDATE:

Я проверил каталог с более чем 4000 файлами. И dir, и ls показывают схожие результаты: около 0,34 сек. Что неплохо, я думаю. (MATLAB 2011a, Windows 7, 64-разрядная версия)

Ваш каталог расположен на локальном жестком диске или в сети? Может быть, поможет дефрагментация жесткого диска?

...