如何同时处理多个文件?

时间:2011-09-23 03:02:16

标签: java multithreading file concurrency io

我有一个场景,爬虫在不同的目录中定期删除web存档文件(warc)。每个warc文件内部都包含数千个HTML文件。

现在,我需要构建一个框架来有效地处理这些文件。我知道Java不能在I / O的并行处理方面进行扩展。我在想的是有一个监视器线程来扫描这个目录,选择文件名并放入Executor Service或一些Java阻塞队列。在执行程序服务下监听的一堆工作线程(可能是I / O问题的一小部分)将读取文件,读取其中的HTML文件并进行相应的处理。这是为了确保线程不会争用同一个文件。

这在性能和可扩展性方面是否是正确的方法?另外,如何处理文件后如何处理?理想情况下,应移动或标记文件,以便线程不会再次拾取它们。可以通过Future对象处理吗?

2 个答案:

答案 0 :(得分:1)

在Java的最新版本中(我认为从1.5开始)已经内置了文件更改通知服务作为本机io库的一部分。你可能想先检查一下,而不是自己动手。见here

答案 1 :(得分:1)

我的主要建议是避免重新发明轮子,除非你有一些特殊要求。

如果您使用的是Java 7,则可以利用WatchService(由Simeon G建议)。

如果您受限于Java 6或更早版本,则JRE中不提供这些服务。但是,Apache Commons-IO提供文件监视请参阅here

作为优于Java 7的优势,Commons-IO监视器将为您创建一个线程,用于针对已注册的回调引发事件。使用Java 7,您需要自己轮询事件列表。

一旦你有了这些事件,你建议使用ExecutorService处理离线文件是一个很好的建议。 Java IO支持移动文件,您可以忽略所引发的任何删除事件。

我过去使用过这个模型并取得了成功。

以下是需要注意的事项:

  • 一旦文件存在于目录中,可能会引发新文件事件。但是,数据仍将被写入其中。考虑对文件大小的合理期望以及您需要等待多长时间才能将文件视为“整体”

  • 您必须在文件上花费的最长时间是多少?

  • 通过配置调整您的执行程序服务参数 - 这将简化您的性能测试

希望这会有所帮助。祝你好运。