在Java中,获得最新(从上次修改的文件中递减)n个文件的最佳优化方式是什么?而不必加载大目录中的所有文件

在Java中,获得最新(从上次修改的文件中递减)n个文件的最佳优化方式是什么?而不必加载大目录中的所有文件,java,file,java-8,file-io,java-7,Java,File,Java 8,File Io,Java 7,目标是获取最新的100个文件。 目前,它是通过扫描所有文件(准备文件列表)然后应用排序+限制来完成的 这是非常缓慢的-在目录太大的情况下。所以,有没有任何方法或API可以在不加载完整文件列表的情况下实现这一点 目前,当文件数在几千个范围内时,以下三种方法不能提供令人满意的性能 Files.listFiles-Java 1.2 DirectoryStream-Java1.7 Walk-java1.8 您必须查看每个文件的属性才能找到其年龄,并且必须查看所有属性才能找到最新的文件 你唯一的选择自由

目标是获取最新的100个文件。 目前,它是通过扫描所有文件(准备文件列表)然后应用排序+限制来完成的

这是非常缓慢的-在目录太大的情况下。所以,有没有任何方法或API可以在不加载完整文件列表的情况下实现这一点

目前,当文件数在几千个范围内时,以下三种方法不能提供令人满意的性能

  • Files.listFiles-Java 1.2
  • DirectoryStream-Java1.7
  • Walk-java1.8

您必须查看每个文件的属性才能找到其年龄,并且必须查看所有属性才能找到最新的文件

你唯一的选择自由是看你怎么做。例如,不需要读取文件内容

<>我会考虑使用文件.FIN()。从其文档中可以看出,这是为了完成所需的最低工作量

您不需要保存所有文件。追踪所见最新100个中最老的一个。如果“下一个”文件比该文件旧,则不需要保留它。否则,您必须找出100个中的哪一个要丢弃。这就平衡了保留整个列表的开销和决定丢弃什么的开销。如果文件数量远大于100,则可能对您有利


在某种程度上,开销取决于文件系统。如果上次修改的时间存储在目录条目中,则无需查看inode即可获得它。当然,这不在您的控制范围之内。

您必须查看每个文件的属性才能找到其年龄,并且必须查看所有属性才能找到最新的N个文件

你唯一的选择自由是看你怎么做。例如,不需要读取文件内容

<>我会考虑使用文件.FIN()。从其文档中可以看出,这是为了完成所需的最低工作量

您不需要保存所有文件。追踪所见最新100个中最老的一个。如果“下一个”文件比该文件旧,则不需要保留它。否则,您必须找出100个中的哪一个要丢弃。这就平衡了保留整个列表的开销和决定丢弃什么的开销。如果文件数量远大于100,则可能对您有利


在某种程度上,开销取决于文件系统。如果上次修改的时间存储在目录条目中,则无需查看inode即可获得它。当然,这不在您的控制范围之内。

您想获取具有最新更新时间戳的n个文件吗?可能是java目录监视服务。虽然大目录本身就很慢。带有Linux筛选器的ProcessBuilder进程用于最后的文件?如果您对文件的创建有任何控制权,那么在创建时将文件分片到子目录可能会有所帮助。@RaviSamani当然可以先尝试WatchService。每次启动都需要首先进行完整的目录扫描(Files.list),但之后应该会更快。遍历所有文件并将它们存储在
优先级队列中
;当大小达到101时,删除最旧的文件。要获取具有最新更新时间戳的n个文件吗?可能是java目录监视服务。虽然大目录本身就很慢。带有Linux筛选器的ProcessBuilder进程用于最后的文件?如果您对文件的创建有任何控制权,那么在创建时将文件分片到子目录可能会有所帮助。@RaviSamani当然可以先尝试WatchService。每次启动都需要首先进行完整的目录扫描(Files.list),但之后应该会更快。遍历所有文件并将它们存储在
优先级队列中
;当大小达到101时,删除最旧的。那么在我们的例子中,我们看到的文件是10k的倍数-这意味着一些文件夹有-20000个文件,甚至70000个!大目录!所以要找出最新的100个,唯一的方法就是遍历所有的,然后找出-对吗。对将那么多文件放在一个目录中的设计是有缺陷的,因此您必须对有缺陷的设计进行编程。如何将69900个不是最旧的文件移动到单独的目录中?这是一个一次性的成功,将带来未来的好处。@user14387228不幸的是,从上面OP的评论来看,似乎任何文件都可能被修改并成为最新的文件。所以在我们的例子中,我们看到的文件是10k的倍数,这意味着一些文件夹有-20000个文件,甚至70000个!大目录!所以要找出最新的100个,唯一的方法就是遍历所有的,然后找出-对吗。对将那么多文件放在一个目录中的设计是有缺陷的,因此您必须对有缺陷的设计进行编程。如何将69900个不是最旧的文件移动到单独的目录中?这是一个一次性的成功,将带来未来的好处。@user14387228不幸的是,从上面OP的评论来看,似乎任何文件都可能被修改并成为最新的文件。