Как ускорить получение информации о файлах 10.000s файлов - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно собрать много данных о файлах изображений и фильмов в каталоге (или дереве каталогов).Это включает в себя имя файла, дату создания и изменения, размер файла (и, возможно, позже дополнительные данные, такие как размер изображения - если доступно - который здесь не рассматривается).Есть 10.000 из них.Чтобы запросить 17 000 файлов, программе необходимо 10 минут для выполнения этой задачи.Я делаю это с помощью следующего кода, но есть ли способ значительно ускорить его?

Это код, который я использую:

// get files matching extensions
    func getPicFilenames(_ exts: [String]? = nil, includeFolders: Bool = false, skipHiddenFiles: Bool = true)
        -> Array<URL>
    {
        // all to upper once (and drop optional dot)
        let extUpper = exts == nil ?
            [String]() :
            exts!.map { ($0.hasPrefix(".") ? String($0.dropFirst(1)) : $0).uppercased() }
        // let resourceKeys = [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey]

        // we also need size of files
        let resourceKeys = [ URLResourceKey.nameKey, URLResourceKey.isDirectoryKey,
                             URLResourceKey.creationDateKey, URLResourceKey.contentModificationDateKey,
                             URLResourceKey.attributeModificationDateKey, URLResourceKey.fileSizeKey]

        var fileURLs: [URL] = []

        let directoryEnumerator = FileManager().enumerator(at: self, includingPropertiesForKeys: resourceKeys,
                                                           options: skipHiddenFiles ? [.skipsHiddenFiles] : [], errorHandler: nil)!

        for case let fileURL as NSURL in directoryEnumerator {
            guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
                let isDirectory = resourceValues[URLResourceKey.isDirectoryKey] as? Bool
                else {
                    continue
            }

            // we can skip complete descendants! >> directoryEnumerator.skipDescendants()
            if !isDirectory || (isDirectory && includeFolders) {
                if let ext = fileURL.pathExtension {
                    // matching extension? (ignore case!)
                    if extUpper.count == 0 || extUpper.contains((ext.uppercased())) {
                        fileURLs.append( fileURL.absoluteURL! )
                    }
                }
            }
        }
        return fileURLs
    }

Это требует 1 минуты на 1,700 файлов,Если мы анализируем файлы размером 100 000 с, то это должно быть намного быстрее (если это возможно).

Я использую Swift 4.2 на XCode 10.1 с OSX 10.11.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...