【问题标题】:concurrent file processing并发文件处理
【发布时间】:2011-07-11 23:20:44
【问题描述】:

我有一个动态保存大量文件的目录。目前有一项任务会不时列出文件并按顺序处理它们(写入数据库)。由于文件数量的增加,有必要对这些文件进行并行处理。请给我一些想法和java代码示例好吗?

【问题讨论】:

    标签: java multithreading parallel-processing


    【解决方案1】:

    使用 ExecutorService。创建一个Executors.newFixedThreadExecutor(n);,您可能可以将文件处理变成一个可运行(或可调用)的任务,并将其传递给您可以处理的文件

    ExecutorService service = Executors.newFixedThreadExecutor(10);
    
    for(final File file : directory.listFiles()){
       service.submit(new Runnable(){
            public void run(){
                 //do work here on file object
            }
       });
    }
    

    【讨论】:

      【解决方案2】:

      看看 java.nio.file 中的 Watch Servie API。这是文档和教程:http://download.oracle.com/javase/tutorial/essential/io/notification.html

      此服务允许您注册目录上的文件通知更改。对于每个通知,您都可以进行任何您想要的处理。可能比实现自己的东西容易得多。

      【讨论】:

      • +1:虽然这不能回答问题,但对发帖人来说是个好建议。
      【解决方案3】:

      创建一个类saver extends Thread 并在那里处理文件操作(在run() 方法中)?


      http://download.oracle.com/javase/tutorial/essential/concurrency/

      http://download.oracle.com/javase/7/docs/api/java/lang/Thread.html

      【讨论】:

        【解决方案4】:

        如果您熟悉 Java 中的并发,这并不是很明显,所以我先看看 Java Concurrency Tutorial。这是一个很好的起点。

        然后请记住,任何需要由多个线程访问的对象都应该是不可变的或同步的。

        接下来,您可以使用ExecutorService 拥有一个线程池,并让多个线程同时运行。

        我知道这本质上不是同一个过程,但假设您知道如何处理文件,您可以查看以下有关不同上下文中的多线程的问题: questions around synchronization in java; when/how/to what extent

        Parallel-processing in Java; advice needed i.e. on Runnanble/Callable interfaces

        【讨论】:

          【解决方案5】:

          如果我正确理解您从读取到加载数据库的单个任务处理。您可以根据性质(以 DB 为中心、以 CPU 为中心或以 IO 为中心)将此任务分解为不同的任务。例如你可以有不同的任务如下

          1. 当前任务从目录中选择文件并将其传递给下一个任务。

          2. 以 IO 为中心 - 读取文件并存储在内存中然后传递给下一个任务的新任务。

          3. 以数据库为中心 - 将数据从内存加载到数据库然后清理内存的新任务。

          4. 以 IO 为中心 - 将文件移动到其他位置。

          为了进一步提高性能,您可以使用线程池实现任务 2、3、4。这将允许并行处理多个文件。根据任务的复杂性,您可以添加或删除列表中的任何任务以满足您的要求。

          【讨论】:

          • 非常好的建议,除了第 2 步。将整个文件读入内存(几乎)从来没有是个好主意。将步骤 2/3 合并为“将数据从文件流式传输到数据库”。
          • 我同意内存部分,但请记住文件的位置。如果文件位于远程位置,则制作本地副本或将其保存在内存中(如果确定文件大小不会造成任何损害)。并且应用程序可以有一些逻辑来限制内存使用。
          猜你喜欢
          • 2012-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 2015-05-12
          相关资源
          最近更新 更多