Emm*_*ess 6 filesystems android kotlin
它基本归结为:如果我在一个目录中有4000个文件,File.isDirectory()函数需要1ms才能执行,因此该目录需要4s来计算(太慢[1]).
我还没有最完整的文件系统知识,但我认为isDirectory()可以为目录中的所有元素进行批处理(读取一大块数据,然后分离单个文件的元数据).C/C++代码是可接受的(可以使用JNI运行),但应保留为最后一个资源.
我找到了FileVisitor,但它似乎不是我问题的最佳解决方案,因为我不必访问整个文件树.我也发现了BasicFileAttributeView,但似乎它有同样的问题.这是一个相关的问题,但没有提供重要解决方案的答案.
[1]:因为它不是我唯一做的事情,它最终会像17s一样.
编辑:代码:
internal fun workFrom(unit: ProcessUnit<D>) {
launch {
var somethingAddedToPreload = false
val file = File(unit.first)
....
//Load children folders
file.listFiles(FileFilter {
it.isDirectory
})?.forEach {
getPreloadMapMutex().withLock {
if (getPreloadMap()[it.path] == null) {
val subfiles = it.list() ?: arrayOf()
for (filename in subfiles) {
addToProcess(it.path, ProcessUnit(it.path + DIVIDER + filename, unit.second))
}
getPreloadMap()[it.path] = PreloadedFolder(subfiles.size)
if (getPreloadMap().size > PRELOADED_MAP_MAXIMUM) cleanOldEntries()
getDeleteQueue().add(it.path)
somethingAddedToPreload = somethingAddedToPreload || subfiles.isNotEmpty()
}
}
}
...
if(somethingAddedToPreload) {
work()
}
}
}
private fun addToProcess(path: String, unit: ProcessUnit<D>) {
val f: () -> Pair<String, FetcherFunction<D>> = { load(path, unit) }
preloadList.add(f)
}
private suspend fun work() {
preloadListMutex.withLock {
preloadList.forEach {
launch {
val (path, data) = it.invoke()
if (FilePreloader.DEBUG) {
Log.d("FilePreloader.Processor", "Loading from $path: $data")
}
val list = getPreloadMap()[path]
?: throw IllegalStateException("A list has been deleted before elements were added. We are VERY out of memory!")
list.add(data)
}
}
preloadList.clear()
}
}
Run Code Online (Sandbox Code Playgroud)
PS:我会在实现优化之前删除工作中的协程,完整代码在这里.
你可以运行一个ls -F并检查输出,如果文件是一个目录,通过查看最后一个字符,目录将以/.例如
val cmd = "ls -F ${myFile.absolutePath}"
val process = Runtime.getRuntime().exec(cmd)
val files = process.inputStream
.bufferedReader()
.use(BufferedReader::readText)
.lines()
for (fileName in files) {
val isDir = fileName.endsWith("/")
}
Run Code Online (Sandbox Code Playgroud)
我在模拟器上运行一个快速测试,有4000个文件和4000个目录,整个过程需要大约150毫秒.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |