2016-09-28 5 views
3

Я пытаюсь получить файлы с 3 сетевых дисков, используя list.files, и это требуется навсегда. Когда я использую 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 

Вот эквивалентная команда оболочки.

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

Мне нужно решение, которое работает в системах Windows и Unix. У кого-нибудь хорошая идея? Сетевые диски имеют около 120 000 файлов, но около 16 ТБ. Так что не так много файлов, но очень больших.

+1

Что мешает вам выполнять системный вызов 'find' для создания списка? Существуют портативные версии поиска для окон. Packaginf это с вашим скриптом не должно быть реальной проблемой. – 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

На самом деле, у меня почти нет опыта работы с окнами, а не с помощью команды 'dir'. Я просто использовал Google и тестировал на одной конкретной машине, и, похоже, она работает. Поэтому я не понимаю ваш комментарий :-) – drmariod

+0

Начиная с windows7 короткие имена файлов могут быть отключены, в этом случае переключатель/b переключателя dir не внесет никаких изменений, и вы закончите с длинными именами файлов: «longfilenamesover8chars.txt msgstr "стать" longfi ~ 1.txt "в shortname. переключатель/b может (или нет) вернуть короткое имя и сломать код. Вам просто нужно быть осторожным. – Tensibai

Смежные вопросы