我查了一下sorting files in directory by size using java array list && How to sort an ArrayList by its elements size in Java?
我的问题是,实现比较器的最佳方法是什么,以便排序速度更快?有人告诉我,100k 文件的排序应该在几秒钟内完成,而不是几分钟,因为文件大小很长。 有没有更好的方法来实现比较器?
我的比较器是:
public static List<File> sortFilesBySize(List<File> xmlFileList) {
xmlFileList.sort(Comparator.comparing(File::length).reversed());
return xmlFileList;
}
哪里
private static List<File> xmlFileList = new ArrayList<File>();
xmlFileList 填充为:
pathList = pathList.subList(0,filterCount);
for (Path filePath : pathList)
xmlFileList.add(filePath.toFile());
filterCount 是我如何按要排序的文件数量进行过滤
并且 sortFilesBySize 被调用为:
long startSortMillis = System.currentTimeMillis();
sortFilesBySize(xmlFileList);
long timeInMillis = System.currentTimeMillis() - startSortMillis;
通过改变按 5k、10k、20k 等排序的文件数量,我得到了
- 5k ----> 1329 毫秒
- 10k ---> 2808 毫秒
- 20k ---> 29790 毫秒
- 40k ---> 428408 毫秒
- 80k ---> 838658 毫秒
- 100k --> 1159034 毫秒
可以观察到,20k 之后排序需要几分钟。有什么建议可以减少排序时间吗?
我还查了https://docs.oracle.com/javase/8/docs/api/java/io/File.html看看我是否可以改进当前的实现,但似乎没有任何结果。
最佳答案
这确实是由File.length()
上的系统调用引起的。它们的数量随着文件数量的增加而增加。按照建议缓存它。你会发现排序时间几乎消失了。
关于Java 8 - 按大小改进大量文件的排序时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614234/