2011-03-09 74 views
4

我有一個動態保存大量文件的目錄。目前有一項任務會不時列出文件並按順序處理它們(寫入數據庫)。由於文件數量的增加,有必要對這些文件進行並行處理。你能給我一些想法和java代碼示例嗎?併發文件處理

回答

0

這不是如果你熟悉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

3

使用一個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 
     } 
    }); 
} 
1

工作文件看一看的java.nio中的監視在役API 。文件。以下是文檔和教程:http://download.oracle.com/javase/tutorial/essential/io/notification.html

此服務允許您在目錄上註冊文件通知更改。對於每一個通知,你可以做任何你想要的處理。可能比實現你自己的事容易得多。

+0

+1:雖然這不能回答這個問題,但對於海報來說這是一個很好的建議。 – Karmastan 2011-03-09 15:42:47

0

如果我正確理解你的單個任務處理從讀取到數據庫加載。您可以根據性質(以數據庫爲中心,以CPU爲中心或以IO爲中心)將此任務分解爲不同的任務。例如,您可以執行以下不同的任務:

  1. 當前任務,從目錄中選取文件並將其傳遞給下一個任務。

  2. IO Centric - 新任務讀取文件並存儲在內存中,然後傳遞給下一個taks。

  3. 以數據庫爲中心 - 新任務將數據從內存加載到數據庫,然後清理內存。

  4. 以IO爲中心 - 將文件移動到其他地方。

要進一步提高性能,可以使用線程池實現任務2,3,4。這將允許並行處理多個文件。根據任務的複雜性,您可以添加或刪除列表中的任何任務以滿足您的要求。

+0

除了第2步以外,還有相當不錯的建議。將整個文件讀入內存幾乎是一個不錯的主意。將步驟2/3合併爲「從文件到數據流的流數據」。 – jtahlborn 2011-03-09 16:38:24

+0

我同意內存部分,但是要記住文件的位置。如果文件位於遠程位置,則可以創建本地副本或將其保存在內存中(如果確定文件大小不會造成任何傷害)。此外,應用程序還可以有一些邏輯來限制內存使用。 – Amit 2011-03-09 16:42:33