2011-09-23 109 views
1

我有一個場景,網絡歸檔文件(warc)被一個爬蟲週期性地放在不同的目錄中。每個warc文件內部由數千個HTML文件組成。如何同時處理多個文件?

現在,我需要構建一個框架來有效地處理這些文件。我知道Java並沒有按照I/O的並行處理進行擴展。我在想的是有一個監視線程掃描此目錄,選擇文件名並放入一個Executor服務或一些Java阻塞隊列。一堆工作線程(可能是I/O問題的一小部分)在執行程序服務下進行偵聽,將讀取這些文件,讀取其中的HTML文件並進行相應的處理。這是爲了確保線程不會爭奪相同的文件。

這是在性能和​​可擴展性方面的正確方法嗎?另外,如何處理文件一經處理?理想情況下,文件應該被移動或標記,以便它們不會被線程再次拾取。這可以通過Future對象來處理嗎?

回答

1

在最近的Java版本中(從1.5開始我相信)已經在文件更改通知服務中內置了本地io庫的一部分。你可能想先檢查一下,而不是單獨進行。請參閱here

+0

感謝您的答覆。這可能有助於確定新文件是否已放入目錄,但這並不能真正解決我的問題。根據要求,我需要將這些文件處理後移動到一個歸檔文件夾。我可以在工作完成後讓工作線程移動文件,但需要通知主線程。原因是,如果工作進程發生故障,需要重新嘗試重新嘗試該文件。 – Shamik

+0

@ simeon..this功能在jdk 7中可用,但我仍然在jdk 6中。在做一些研究時,我發現了一個名爲jpathwatch的類似庫,它提供了類似的功能。我將檢查它。感謝指針。 – Shamik

1

我的主要建議是避免重新發明車輪,除非您有特定的要求。

如果您使用的是Java 7,則可以利用WatchService(如Simeon G所建議的)。

如果您僅限於Java 6或更早版本,這些服務在JRE中不可用。但是,Apache Commons-IO提供文件監視,請參閱here

作爲一個優於Java 7的優勢,Commons-IO監視器將爲您創建一個線程,針對已註冊的回調引發事件。使用Java 7,您需要自己輪詢事件列表。

一旦你有了這些事件,你建議使用ExecutorService來脫機處理文件是一件好事。移動文件由Java IO支持,您可以忽略引發的任何刪除事件。

我以前用這個模型成功了。

這裏有一些事情要注意:

  • 新文件事件一旦文件存在於目錄中可能會得到提升。但是,數據仍將被寫入它。考慮對文件大小的合理期望以及需要等到文件被認爲是「整體」的時間長度

  • 您必須花費在文件上的最長時間是多少?

  • 讓你執行服務參數配置通過tweakable - 這將簡化您的性能測試

希望這有助於。祝你好運。

+0

@Ryan ...感謝您的指點。我在java 6中,所以不能利用WatchService。但是我看過jpathwatch,它與WatchService類似。監視器將在創建文件時引發事件。在我的情況下,生成warc文件的工具首先創建一個臨時文件並向其寫入數據。一旦完成,它會gzip文件。我希望,因爲這是一個新的文件擴展名,偵聽器將它視爲一個新的文件事件。在這種情況下,我很容易跟蹤。 – Shamik