2013-04-03 13 views
13

Używam exist(x, 'file'), aby sprawdzić, czy istnieje plik na moim komputerze. Wykonanie tego polecenia trwa FOREVER (ponad 10 sekund na połączenie!).W MATLAB istnieje (x, "plik") trwa wiecznie

Moje matlabpath nie jest zbyt długa (około 200 wpisów) i wszystkie foldery na ścieżce znajdują się na dysku lokalnym (bez sieci).

  1. Dlaczego exist trwa wieczność?
  2. Czy istnieje sposób, aby uruchomić SZYBCIEJ?

PS
To wezwanie do exist jest częścią realizacji Matlaba z loadlibrary. Tak więc, jeśli dzwonisz pod numer loadlibrary i nie wiesz, dlaczego trwa na zawsze - to pytanie jest również dla Ciebie.

+2

Po prostu z ciekawości, jaka jest wartość 'x'? –

+0

Na wszelki wypadek przyjrzyjmy się temu problemowi, który miałem jakiś czas temu. Jeśli piszesz do pliku znajdującego się na ścieżce matlab przed wywołaniem 'exist', może to spowodować problem: http://stackoverflow.com/questions/15386917/why-does-writing-to-an-unrelated-file- przyczyna-ładunek-funkcja-być-tak-powolny – jazzbassrob

+0

Również; nie jest to dokładnie odpowiedź, ale jeśli możesz pobrać plik "existfile", prawdopodobnie rozwiąże to problem: http://www.mathworks.co.uk/matlabcentral/fileexchange/13775-multicore-parallel-processing-on-multiple-cores/ content/existfile.m – jazzbassrob

Odpowiedz

17

Wow! To było trudne. Podsumowując: Usuń pliki% TEMP%!

Miałem kilka tysięcy plików leżących w %TEMP%. Wygląda na to, że MATLAB naprawdę lubi przeglądać katalog TEMP.

Po wyczyszczeniu folderu TEMP, exist uruchamia się w mgnieniu oka!

(Andrew Dzięki za radę Process Monitor!)

21

Oto jeden pomysł. Możesz umieścić katalog zawierający te pliki nagłówkowe na początku ścieżki MATLAB, więc gdy exist() przejrzy tę ścieżkę, odnajduje je szybko i nie musi przeszukiwać pozostałych pozycji. Jeśli spędza czas na swojej ścieżce, może to pomóc.

+0

Z pewnością spróbuję! – Shai

+0

Wypróbuj sprawę prokmon, też, jeśli jesteś w systemie Windows - podejrzewam, że możesz być uruchomiony, aby zmienić ograniczenia obsługi powiadomień. Chociaż wszystkie są lokalnymi katalogami, może to być problem tylko dlatego, że tak jest Wiele z nich. –

+0

Dziękujemy za wskazówki i porady. W końcu to zrobiłem - zbyt wiele plików w folderze% TEMP% ... Twoja rada była bardzo pomocna. – Shai

1
  1. exist jest zbudowany w funkcji Matlab. Jest przeznaczony do sprawdzania istnienia innych typów obiektów (takich jak zmienne w Matlab), jak również plików. Będąc wbudowaną funkcją, nie jest łatwo zobaczyć, jak jest ona kodowana. Przynajmniej w Windows, kiedy wywołujesz exist('filename','file'), pozornie wykonuje tylko jedno wywołanie API do systemu operacyjnego, aby sprawdzić istnienie pliku. Tak więc system operacyjny zajmuje dużo czasu, lub jest pewne nadymanie w funkcji exist, dzięki czemu działa wolno. Zobacz rozwiązania z innych plakatów pomysłów, w jaki sposób sprawić, że system operacyjny szybciej wrócić jej wynik

  2. Ludzie czasami skarżą się, że działa exist('filename','file') w pętli powoduje, że pętla bardzo powoli, jest to spowodowane wywołanie biorąc może milisekund i zapętlając się kilka tysięcy razy. Rozwiązaniem tego problemu jest zastąpienie

 
    if exist('filename','file') 
     % your code 

z linią

 
    if java.io.File('filename').exists 
     % your code 
+0

interesujące podejście do wykorzystania API 'java' do tego zadania. Czy możesz potwierdzić (używając np. Profilera), że podejście Java jest rzeczywiście szybsze? – Shai

0

Do 372 plików Matlab: Czas jest 40.207266 sekund. (weź filiżankę) Java: Upływający czas to 0.122165 sekund. (mruganie oczami)