2013-09-05 89 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行,所有大文件只能以這種方式處理,因爲無論你增加了多少內存參數,只要有更大的文件需要處理,就會發生內存不足,所以使用可以批量處理記錄的實現。這需要一些額外的編碼工作,但無論您需要處理多大的文件都不會失敗。

乾杯!