Java 8 - 按大小改进大量文件的排序时间

标签 java sorting comparator

我查了一下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 等排序的文件数量,我得到了

  1. 5k ----> 1329 毫秒
  2. 10k ---> 2808 毫秒
  3. 20k ---> 29790 毫秒
  4. 40k ---> 428408 毫秒
  5. 80k ---> 838658 毫秒
  6. 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/

相关文章:

java - 如何在 Raspberry PI(armv6 和 armv7 Raspian)上使用 Java 中的 OpenCV 4?

algorithm - 平均重复游戏以达到每个参与者的最大数量

algorithm - 到位排序

c++ - 如何为 map 提供需要静态数据的比较器?

Java thenComparing通配符签名

c++ - 这个比较是否不一致(还是存在另一个问题)?

java - 在java中更新后调用绘制图形

java - 如何找到使用 FileOutputStream 创建的文件的路径

java - 格式化 Mysql JSON 与在后端重新格式化为 JSON

ruby - 如何按字母顺序对字符串的字符进行排序?