2013-09-05 59 views
0

我们使用JDK 7 watchservice观察可以有xml或csv文件的目录。这些文件放在线程池中,稍后处理并推送到数据库中。此应用程序永远运行,用于监视目录并在可用时保持处理文件。 XML文件很小并且不需要时间,但是每个csv文件可以包含超过8万条记录,因此处理需要时间才能放入数据库。 Java应用程序在从线程池处理15个csv文件时,会给我们带来outofmemory错误。有没有什么办法在csv文件进入线程池时,可以按顺序处理,即一次只处理一个。按顺序处理线程池执行文件

+1

如何使用Executors#newSingleThreadExecutor()'? – Katona

+0

需要为csv文件创建单独的执行程序... newSinglethreadExecutor()似乎做得很好...任何示例都会很棒.. – user2751620

回答

0

你可以试试:

  1. 使用-Xmx JVM选项
  2. 使用不同的执行,以减少一次处理的文件数量增加JVM的内存。一个大刀阔斧的解决方案是使用一个SingleThreadExecutor

    public class FileProcessor implements Runnable { 
        public FileProcessor(String name) { } 
        public void run() { 
         // process file 
        } 
    } 
    
    // ... 
    ExecutorService executor = Executors.newSingleThreadExecutor(); 
    // ... 
    
    public void onNewFile(String fileName) { 
        executor.submit(new FileProcessor(fileName)); 
    } 
    
1

Java应用程序给我们的内存溢出错误,当有来自线程池得到处理15个CSV文件。有没有什么办法在csv文件进入线程池时,可以按顺序处理,即一次只处理一个。

如果我理解,如果您超过某个阈值,您希望停止添加到池中。有一种简单的方法可以通过使用阻塞队列和被拒绝的执行处理程序来实现。

请参见下面的回答:

Process Large File for HTTP Calls in Java

要总结一下,你做的东西像下面这样:

// only allow 100 jobs to queue 
final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(100); 
ThreadPoolExecutor threadPool = 
    new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue); 
// we need our RejectedExecutionHandler to block if the queue is full 
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() { 
     @Override 
     public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { 
      try { 
       // this will block the producer until there's room in the queue 
       executor.getQueue().put(r); 
      } catch (InterruptedException e) { 
       throw new RejectedExecutionException(
        "Unexpected InterruptedException", e); 
      } 
    } 
}); 

这将意味着它会阻止增加了排队,不应该耗尽内存。

1

我会采取不同的途径来解决你的问题,我猜你除了当你开始将太多的数据读入内存时,都拥有一切。

不知道你如何阅读csv文件,建议使用LineReader并阅读例如500行处理它们,然后读取下一行500行,所有大文件只能以这种方式处理,因为无论你增加了多少内存参数,只要有更大的文件需要处理,就会发生内存不足,所以使用可以批量处理记录的实现。这需要一些额外的编码工作,但无论您需要处理多大的文件都不会失败。

干杯!