在基于node.js的程序中,我试图从500,000多个路径的数组中过滤掉元素,例如:paths = ['C:/test/file.txt', 'C:/python/', ...]
基本上,代码正在做的是:
如果itemTypeToSearch
有"files"
=>通过过滤出"目录"的所有路径来更新paths
数组。 (只留下文件)
如果itemTypeToSearch
有"folders"
=>通过过滤掉"文件"的所有路径来更新paths
数组。 (只留下目录)
import fs from 'fs'
...
itemTypeToSearch: ["files"]
...
console.time("time it took:")
// IF ONLY 1 TYPE SELECTED, FILTER IT OUT
if (this.itemTypeToSearch.length == 1 && this.itemTypeToSearch.includes("files")) {
paths = paths.filter(element => {
return fs.statSync(element).isFile()
})
}
else if (this.itemTypeToSearch.length == 1 && this.itemTypeToSearch.includes("folders")) {
paths = paths.filter(element => {
return fs.statSync(element).isDirectory()
})
}
console.timeEnd("time it took:")
此过滤操作大约需要4 seconds
来处理100,000个路径的数组。
之后,我将过滤后的数组转换为一个对象数组,以便在另一个函数中进一步使用:
[{path: 'C:/test/file.txt'}, {path: 'C:/python/python.exe'}, ...]
如何让它更快? (比如快得多)
我应该将其转换为第一个对象数组吗?这会让我更快地过滤物品吗?
答案 0 :(得分:0)
使用fs.statSync(element).isDirectory()
或fs.statSync(element).isFile()
时,我无法更快地过滤掉这么大的数组中的元素。
也许可以通过检查字符串是否以已知扩展名结尾(这意味着它是一个文件)来更快地完成,正如@epascarello在评论中所建议的那样。
也许会有人发布解决方案。
就我而言,在非过滤阵列上进行所有操作的速度要快10倍(尽管它的路径数量约为2倍)
然后当程序显示最终结果(限制为100个项目)时,在此步骤中将其过滤掉,这将只需几毫秒