Java 中获取最新(降序最后修改)n 个文件的最佳优化方式是什么 - 无需加载大目录的所有文件
what is best optimized way in Java to get latest (Descending Last-Modified) n files - without loading all files of a large directory
目标是获取最新的 100 个文件。
目前它是通过扫描所有文件 - 准备文件列表 - 然后应用排序+限制来完成的。
这非常慢 - 在目录太大的情况下。那么有没有什么方法或 API 可以在不加载完整文件列表的情况下执行此操作。
当文件在几千个范围内时,目前以下三种方法不能提供令人满意的性能。
- Files.listFiles - Java 1.2
- DirectoryStream - Java 1.7
- Files.Walk - Java 1.8
您必须查看每个文件的属性才能找到它的年龄,您必须查看所有文件才能找到最新的 N 个。
您唯一的选择自由是如何您如何查看。例如,无需读取文件内容。
我会考虑使用 Files.find()。从其文档中可以看出,这可以完成所需的最少工作。
您不需要保存所有文件。跟踪最新的 100 个中最旧的。如果 'next' 文件早于该文件,则无需保留它。否则你必须弄清楚要丢弃 100 个中的哪个。这折衷了保留整个列表的开销和决定丢弃什么的开销。如果文件数量远大于 100,它可能对您有利。
在某种程度上,开销是 file-system 依赖的。如果 last-modified 时间存储在目录条目中,则无需查看 inode 即可获取它。当然,这不在你的控制之下。
目标是获取最新的 100 个文件。 目前它是通过扫描所有文件 - 准备文件列表 - 然后应用排序+限制来完成的。
这非常慢 - 在目录太大的情况下。那么有没有什么方法或 API 可以在不加载完整文件列表的情况下执行此操作。
当文件在几千个范围内时,目前以下三种方法不能提供令人满意的性能。
- Files.listFiles - Java 1.2
- DirectoryStream - Java 1.7
- Files.Walk - Java 1.8
您必须查看每个文件的属性才能找到它的年龄,您必须查看所有文件才能找到最新的 N 个。
您唯一的选择自由是如何您如何查看。例如,无需读取文件内容。
我会考虑使用 Files.find()。从其文档中可以看出,这可以完成所需的最少工作。
您不需要保存所有文件。跟踪最新的 100 个中最旧的。如果 'next' 文件早于该文件,则无需保留它。否则你必须弄清楚要丢弃 100 个中的哪个。这折衷了保留整个列表的开销和决定丢弃什么的开销。如果文件数量远大于 100,它可能对您有利。
在某种程度上,开销是 file-system 依赖的。如果 last-modified 时间存储在目录条目中,则无需查看 inode 即可获取它。当然,这不在你的控制之下。