【问题标题】:Should I first collect the files and then execute a task or should I execute tasks while collecting?)我应该先收集文件然后执行任务还是应该在收集时执行任务?)
【发布时间】:2012-02-11 16:28:24
【问题描述】:

我需要浏览给定文件夹(及其子文件夹)的所有文件并在每个文件上执行一些操作。 我一直在寻找一种递归遍历所有文件的方法,并在 Apache Commons Io 中找到了一个解决方案: FileUtils.iterateFiles 它返回一个迭代器。 我检查了它的实现方式,发现它遍历了所有文件并将它们添加到集合中,然后返回集合的迭代器。 好吧,这就是它的作用。这就是我要找的:)

但后来我想 - 首先收集所有文件然后循环所有文件并执行我想要的是否有效? 还是我应该不收集它们,而只在递归遍历中执行操作?

应该注意,我对文件所需的操作包括对文件的 IO 操作,这可能会失败..(可以通过两种方式处理..但请注意以防我在我的思路中遗漏了一些东西) 此外,我正在遍历的文件夹和文件集可能会达到 400 个文件夹或 5000 个左右的文件,并且文件大小可能会达到几千兆(同样,在仅遍历文件时并不那么相关,但因为我打算执行 IO 任务而相关)。 .

有什么想法吗?

谢谢。

【问题讨论】:

    标签: java file io


    【解决方案1】:

    这可能取决于列表的大小。如果将列表保存在内存中没有问题,那么我会在处理文件之前完成列表。 原因很简单:一方面,由于文件系统组织,扫描目录树通常很快;另一方面,您可能应该一次按顺序处理一个文件,以获得更好的性能(如果您同时处理多任务并同时处理多个文件,那么您的磁盘会变慢)。

    【讨论】:

      【解决方案2】:

      从磁盘读取内容既慢又昂贵。最好的方法是使用多线程,这样您就不会浪费时间等待 IO 返回文件内容。一旦发送文件读取,读/写线程就会进入睡眠一段时间,另一个线程将处理您需要做的事情。一旦读/写线程唤醒,它就会写入磁盘。

      要回答您的问题,由于内存限制,不可能一次加载所有文件(及其内容)并继续处理它们。使用多线程一次处理几个文件。或者你可以使用 mapreduce,这取决于给定的任务

      【讨论】:

      • 1.我并不是要一次加载所有文件。我开始收集文件的路径,然后在收集完所有路径后,通过收集,与不收集路径相反,而是在第一次遍历树时执行我想要的.. 2.你能详细说明关于如何使用 mapreduce 来做到这一点?任务包括复制文件和修改文件(不同类型的文件所以不同类型的任务..)。我对 mapreduce 有点熟悉,但还没有达到我可以实现我需要的水平..
      • 我明白了。我仍然会避免首先亲自收集所有文件名。这只是一个额外的操作,不会给你带来任何好处。 MapReduce 可能不适合您的情况,除非您“滥用”该用法。 :)
      【解决方案3】:

      您应该开始在文件系统上导航,创建一个 Runnable/Callable 实现来处理您想要对这些文件执行的操作,然后在找到的每个文件之前将其提交到 ThreadPool(您可以从 Executors 类创建一个)。

      在这种情况下,您可能应该使用固定的线程池,并且大小可能会有所不同,您应该进行基准测试并查看处理文件的线程数量如何影响性能。

      【讨论】:

      • 其实我的初衷不是做这个多线程的。我想浏览文件并在每个文件上同步执行某些操作。我的问题是关于何时执行我想要的 - 在迭代文件夹树时?或者首先迭代文件夹树,收集所有文件,然后浏览我收集的所有文件并执行我想要的。但是多线程问题是个好主意。考虑到任务涉及到/从磁盘的 IO,它是否在此处添加任何内容以在多个线程中执行任务?
      • 这取决于。文件大吗?你在做什么样的手术?您可以将文件内容缓存在内存中并在可能的情况下对其进行处理吗?这里有很多变数。
      • apache 的 iterateFiles 所做的不是缓存内存中的内容。它提供了所有 File 对象的集合。文件大小可能会有所不同.. 有些可能只有几 MB,有些可能只有几 GIGAS
      • 然后由您决定,对此没有单一的答案。如果您在文件上运行的进程比 IO 密集型处理器更密集,则使用多线程可能是更好的选择。您应该尝试、基准测试并做出决定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2010-12-15
      • 2021-09-10
      • 2013-10-10
      相关资源
      最近更新 更多