【问题标题】:What is the most efficient way to list all of the files in a directory (including sub-directories)?列出目录(包括子目录)中所有文件的最有效方法是什么?
【发布时间】:2010-03-19 18:56:06
【问题描述】:

我正在编写一个 servlet,它将检查服务器上的目录(Web 容器外部),并递归搜索某些文件(通过某些文件,我指的是具有特定扩展名和特定命名的文件惯例)。一旦找到这些文件,servlet 就会以所有找到的文件的长列表(包括文件的完整路径)作为响应。我的问题是文件和目录太多,以至于我的 servlet 运行速度非常慢。我想知道是否有针对此类问题的最佳实践或现有 servlet?简单地编译整个文件列表并在客户端通过 js/jquery 进行过滤会更有效吗?

【问题讨论】:

    标签: java file servlets recursion


    【解决方案1】:

    磁盘访问速度很慢,并且随着文件和目录数量的增加,您将很快达到在使用传统递归搜索目录树时您的 servlet 将无用的地步。如果您有大量并发用户同时执行相同的搜索,您将很快达到此限制。

    相反,使用外部批处理作业生成文件列表要好得多,然后可以通过数据库调用将其读入 servlet,甚至只需解析包含由换行符分隔的所有文件名的文件。在 Linux 上使用“查找”是一种简单的方法:例如

    find <path_to_directory> -name '*.bin' > list_files.txt
    

    这将列出特定目录中以 .bin 结尾的每个文件名,并将其输出到名为 list_files.txt 的文件中。然后您的 servlet 可以读取该文件并从那里创建文件列表。

    【讨论】:

      【解决方案2】:

      如果您确实有大量文件,您可能会考虑生成一个外部进程来进行搜索。如果您在类似 unix 的服务器(如 linux)上运行,您可能会通过让“find”命令为您搜索并解析其输出来获得速度提升。

      您可以在 Google 上找到许多有关如何使用“查找”的示例。

      【讨论】:

      • 非常感谢您的回答!
      【解决方案3】:

      我认为此过程进展缓慢的两个可能原因是:

      1) 磁盘 I/O 耗时过长。这将是一个真正的约束,你无能为力。通常操作系统非常擅长将结构保存在内存中,从而可以更快地找到文件夹中的文件。如果无论如何都太慢,您可能必须自己在内存中建立索引。这一切都取决于你是如何做到的。

      无论如何,如果这是问题所在(您可以尝试测量),那么进行过滤客户端将无济于事,因为无论您在哪里执行此操作都不会花费很长时间。相反,您将通过向客户端发送更多数据来进行排序,从而使客户端变慢。

      2) 你的目录遍历有问题。你说它是“递归的”。如果您的意思是它实际上是递归的,即一种在遇到新目录时调用自身的方法,那么这很可能会减慢您的速度(开销确实增加了)。维基百科上有一些关于 tree traversal 的内容,但基本上只是使用队列或堆栈来跟踪您在遍历中的位置,而不是使用您的方法状态来这样做。

      请注意,文件系统实际上并不是一棵树,但我假设在这种情况下它是。否则它会变得有点毛茸茸。

      我不同意您不能在进程中实施它的其他海报。在一定程度上它应该可以很好地工作,现在还不需要批处理作业。

      【讨论】:

      • 感谢您的回复。我认为批处理作业是我正在寻找的,因为这个 servlet 将被许多用户使用并且文件列表非常大(如果我在服务器上执行简单的 ls/find 需要几分钟才能列出所有内容) .
      • 我明白了。 find 可能比您自己实现的大多数事情要快。尽管如此,如果它这么慢并且您一直有多个用户查询它,那么无论哪种方式您仍然会降低您的性能,因此我会考虑使用一些内存结构或平面索引。
      【解决方案4】:

      我认为您的 servlet 工作缓慢是因为硬盘驱动器的速度。如果文件列表是永久的,则应将其加载到内存中

      【讨论】:

        猜你喜欢
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 2023-01-04
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多