WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Schnellere Methode als genpath

 

Alex4456
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2014, 12:02     Titel: Schnellere Methode als genpath
  Antworten mit Zitat      
Hi,

ich möchte gerne alle .bin Dateien eines Ordners + Unterordner mit Pfad haben.

Dazu benutze ich momentan genpath und mach dann eine for schleife über genpath mit dir(path)

Exemplarisch:

Code:
paths = genpath(inputPath);
for ii=1:length(paths)
fileNames = dir(paths(ii));
%use Data..
end


das Dauert ziemlich lange über 10 Minuten, wenn ich auf Ordner mit sehr vielen Dateien + unterordner zugreifen. Gibt es eine schnellere Methode?

Grüße und Danke
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.09.2014, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

hast du mal den Profiler drüberlaufen lassen?
Braucht wirklich genpath die meiste Zeit, oder nicht doch eher das Einlesen/Verarbeiten der Dateien?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:08     Titel:
  Antworten mit Zitat      
Ja habe ich:

50% gehen auf genpath
50% auf die dir(paths).
meine eigentliche Bearbeitung nimmt fast keine Zeit in Anspruch.

Ich kann nicht glauben dass es soo lange dauert. Bei einem kleinen Ordner schon über 2,5 Minuten.
Ich mach etwas ähnliches wie ein Datei Explorer, nur werden sie nach anderen Kritierien geordnet. Wäre es vlt. schneller wenn ich das über Java versuche? Weiß leider nicht wie ich das genau umsetzen würde.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:15     Titel:
  Antworten mit Zitat      
Hi,

ein anderer Vorschlag: warum schreibst du nicht alles via cmd in einem *.txt Datei und liest es in Matlab wieder ein.
Unter cmd:
dir /b /s *.bin > Bin.txt
geht verdammt schnell Wink

MfG,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:30     Titel:
  Antworten mit Zitat      
Hey,

danke erstmal für den Tipp. Ich bekomme jedoch die Fehlermeldung

"CMD does not support UNC paths as current directories".

Es handelt sich dabei um ein Netzwerklaufwerk. Es gibt wohl ein Workaround mit http://support2.microsoft.com/kb/317379. Ich möchte das jedoch ungern machen, da dies ein Netzwerk auf meiner Arbeit ist.

Kann ich das hier in Matlab umwandeln:
http://www.avajava.com/tutorials/le.....ies-using-commons-io.html
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:37     Titel:
  Antworten mit Zitat      
Hi,

du muss es als Netzwerk einbinden, dann funktionierst Wink

Oder benutze diesen Code mal:

Code:

function fileList = getAllFiles(dirName)

  dirData = dir(pwd);                                   %# Get the data for the current directory
  dirIndex = [dirData.isdir];                           %# Find the index for directories
  fileList = {dirData(~dirIndex).name}';                %'# Get a list of the files
  if ~isempty(fileList)
    fileList = cellfun(@(x) fullfile(dirName,x),...     %# Prepend path to files
                       fileList,'UniformOutput',false);
  end
  subDirs = {dirData(dirIndex).name};                   %# Get a list of the subdirectories
  validIndex = ~ismember(subDirs,{'.','..'});           %# Find index of subdirectories
                                                        %#   that are not '.' or '..'
  for iDir = find(validIndex)                           %# Loop over valid subdirectories
    nextDir = fullfile(dirName,subDirs{iDir});          %# Get the subdirectory path
    fileList = [fileList; getAllFiles(nextDir)];        %# Recursively call getAllFiles
  end

end
 


MfG,
Vito

Zuletzt bearbeitet von Vito am 29.09.2014, 13:45, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:39     Titel:
  Antworten mit Zitat      
Ich kenne mich da leider nicht genau aus. Kannst du dich konkretisieren? Smile

Alternativ versuche ich es gerade mit PowerShell, jedoch ist das wohl eine anderen Syntax. Bin dabei.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.09.2014, 13:40     Titel:
  Antworten mit Zitat      
Hallo,

das ist eine Möglichkeit. Das würde ich wenn so machen:
Code:
[status, list] = system('dir /b /s *.bin')
c = strsplit(list);

Dadurch wird das Schreiben/Lesen von Dateien vermieden, und es klappt auch direkt mit Netzwerkpfaden.

Eine andere:
Letztlich ist es ja doppelt gemoppelt, erst alle Verzeichnisse zu suchen und dann nochmal nach den Dateien in den Verzeichnissen.
Man könnte, den Ansatz von genpath verwendend, auch direkt in allen Ordnern nach .bin-Dateien suchen.
In den meisten Fällen wird sich die for-Schleife in diesem Code auch auf
Code:
dirs = dirs(3:end)
reduzieren lassen, da die ersten beiden Einträge die zu überspingenden . und .. sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 29.09.2014, 13:46     Titel:
  Antworten mit Zitat      
Hi,

ich glaube du brauchst das
Code:

function fileList = getAllFiles(dirName)

  dirData = dir(pwd);                                   %# Get the data for the current directory
  dirIndex = [dirData.isdir];                           %# Find the index for directories
  fileList = {dirData(~dirIndex).name}';                %'# Get a list of the files
  if ~isempty(fileList)
    fileList = cellfun(@(x) fullfile(dirName,x),...     %# Prepend path to files
                       fileList,'UniformOutput',false);
  end
  subDirs = {dirData(dirIndex).name};                   %# Get a list of the subdirectories
  validIndex = ~ismember(subDirs,{'.','..'});           %# Find index of subdirectories
                                                        %#   that are not '.' or '..'
  for iDir = find(validIndex)                           %# Loop over valid subdirectories
    nextDir = fullfile(dirName,subDirs{iDir});          %# Get the subdirectory path
    fileList = [fileList; getAllFiles(nextDir)];        %# Recursively call getAllFiles
  end

end
 


MfG,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 29.09.2014, 14:07     Titel:
  Antworten mit Zitat      
Hi,

Netzlaufwerk unter Win 7 einbinden:
Start->Computer->oben rechts im Reiter Netzlaufwerk verbinden.
Laufwerkbuchstaben vergeben und den Pfad eintragen und fertig Smile

Dann unter cmd
dir /b /s *.bin > Bin.txt


MfG,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.09.2014, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

nur damit's nicht übersehen wird: der Umweg über die Datei ist nicht nötig; man kann mit system den dir-Aufruf auch aus MATLAB heraus ausführen und dort das Ergebnis direkt nach-/weiterverarbeiten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 29.09.2014, 14:47     Titel:
  Antworten mit Zitat      
Hi Harald,

das geht nur, wenn das Netzlaufwerk als Laufwerk verbunden ist und nicht als UNC Wink.

MfG,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2014, 15:45     Titel:
  Antworten mit Zitat      
Soo ihr beiden, erstmal vielen Dank

es sieht so aus, als würde Haralds Methode bei mir funktionieren ohne UNC Fehler. Scheint als legt er das Laufwerk automatisch irgendwie an. Ich bekomme jedenfalls dann eine Pfad mit Z:\, habe das in der cmd vorher mit \\Pfad eingegeben, vielleicht lag hier das Problem. Im Explorer ist jedoch kein Z: eingetragen.

Jedenfalls hier der Code, falls es noch andere interessiert

Code:
save_pwd=pwd;
cd(inFolderName);
[~, list] = system('dir /b /s *.bin');
getList = strread(list,'%s','delimiter','');
filePaths = strrep(getList,[list(1),':\'],[inFolderName,'\']);
cd(save_pwd);


strsplit habe ich noch nicht in meiner Version.

Bei meinem Test habe ich die Zeit von 155 auf 6 Sekunden reduziert!

Super und Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.09.2014, 17:45     Titel:
  Antworten mit Zitat      
Hallo,

Korrektur für die, die strsplit verwenden können / wollen:

Code:
[status, list] = system('dir /b /s *.bin')
c = strsplit(list, '\n'); % <-- das \n ist wichtig


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2014, 22:17     Titel:
  Antworten mit Zitat      
Ich möchte zwar den Thread ungern ausgraben, aber da Ich eine deutlich bessere Methode gefunden habe möchte ich diese hier präsentieren:

Code:
function outFilelist = fcnCreateFileList(inFolder,inSave,inEnding)
%% Alex4456 2014
% Matlab ließt die Dateiliste aus einer .txt Datei aus, die von durch ein CMD Befehl erzeugt wird. Dazu sind Schreibrecht in dem Ordner inSave notwendig. Dateien werden anschließend gelöscht.
% inFolder     Pfadangabe. In diesem und allen unterordner wird gesucht
% inSave        Pfadangabe. In diesem Ordner wird 1 .txt Datei erzeugt
% inEnding      Endung der Dateinamen. Nach dieser Dateiendung wird gesucht, sofern leer '', dann
%               wird nach allen Endungen gesucht
%              
outFilelist = 0;
if ~isdir(inSave) || ~isdir(inFolder)
    return
end
pathFilelist = [inSave,'\filelist.txt'];
if strcmp(inEnding,'')
dos =(['cd ',inFolder,' & dir /s /b > ',pathFilelist]);
else
dos =(['cd ',inFolder,' & dir /s /b *.',inEnding,' > ',pathFilelist]);
end
while (~exist(pathFilelist, 'file'))
  sleep(0.5); % or whatever interval you desire
end
fileID = fopen(pathFilelist);
fileLoad = textscan(fileID,'%s');
fclose(fileID);
try
    delete(pathFilelist);
end
outFilelist = fileLoad{1,1};

end


Benchmark bei 180.000 Dateien in 1950 Ordner
Methode 1: über [status, list] = system('dir /b /s *.bin'): 550 Sek.
Methode 2: meine Funktion über Batc: 9 Sek.

Benchmark bei 13.000 Dateien in 1 Ordner
Methode 1: über [status, list] = system('dir /b /s *.bin'): 9 Sek
Methode 2: meine Funktion über Batch: 0.15 Sek.

Kennt jemand den Grund warum das so langsam ist?
Sofern man nur system(..) schreibt, ohne Rückgabewert ist es deutlich schneller. Mir ist natürlich bewusst das die Speicherung Zeit in Anspruch nimmt, aber meiner Menung nach unverhältnis mäßig viel.

edit: ich sehe gerade das Vito das mit der .txt bereits vorgeschlagen hat, dann sei hier nochmal ausdrücklich gesagt, dass das die schnellere Methode ist.
Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.