2016-09-28 24 views
3

我試圖從3個網絡驅動器使用list.files檢索文件,它需要永遠。當我在shell中使用find時,它會在15秒內返回所有結果。list.files的性能問題

system.time(
    jnk <- list.files(c("/Volumes/massspec", "/Volumes/massspec2", "/Volumes/massspec3"), 
        pattern='_MA_.*_HeLa_', 
        recursive=TRUE)) 
# user system elapsed 
# 1.567 6.381 309.500 

這裏是等效的shell命令。

time find /Volumes/masssp* -name *_MA_*_HeLa_* 
# real 0m13.776s 
# user 0m0.361s 
# sys 0m0.620s 

我需要一個適用於Windows和Unix系統的解決方案。有沒有人有個好主意?網絡驅動器共有大約120,000個文件,但大約16TB。所以沒有太多的文件,但非常大的文件。

+1

什麼能阻止你對'find'進行系統調用來構建列表?有用於Windows的便攜式版本的查找。用腳本包裝它不應該是一個真正的問題。 – Tensibai

+0

我希望有一種解決方法,但不幸的是,我必須使用這個解決方案,是的... – drmariod

回答

0

基礎上的評論,我寫了一個小一個R函數應該在Windows和Unix工作...

quickFileSearch <- function(path, pattern) { 
    switch (.Platform$OS.type, 
      unix={ 
      paths <- paste(path, collapse=' ') 
      command <- paste('find', paths, '-name', pattern) 
      system(command, intern=TRUE) 
      }, 
      windows={ 
      paths <- paste(file.path(path, pattern, 
            fsep='\\'), 
          collapse=' ') 
      command <- paste('dir', paths, '/b /s /a-d') 
      shell(command, intern=TRUE)} 
) 
} 

整個事情並不多測試過,但它正在爲我的目的。

+0

備註:你將遇到一個問題/ b系統短文件名被禁用(IIRC自win8由於它是NTFS文件系統的一個屬性,所以在新安裝時默認保留原來的行爲) – Tensibai

+0

實際上,我幾乎沒有使用Windows的經驗,特別是沒有使用'dir'命令。我只用谷歌和測試在一臺特定的機器上,它似乎工作。所以我不明白你的評論:-) – drmariod

+0

從windows7開始,短文件名可能被禁用,在這種情況下,dir的/ b開關不會做任何改變,你最終會得到長文件名:「longfilenamesover8chars.txt 「成爲」longfi〜1.txt「的簡稱。/b開關可能(或不)返回您的短名稱並破壞您的代碼。你只需要小心一點就可以了。 – Tensibai