簡體   English   中英

同時處理目錄和子目錄中的文件

[英]Process files in directories and sub-directories concurrently

我有一個函數,檢查目錄中的文件是否包含一些字符串

boolean processFiles(File file, String phrase) {
      if (file.isFile()) {
        return fileContains(file, phrase);
      }

      try (DirectoryStream<Path> stream = Files.newDirectoryStream(file.toPath())) {
        for (Path entry: stream) {
          if (processFiles(entry.toFile(), phrase) {
            return true;
          }
        }
      }
      return false;
}

如果我有許多目錄,子目錄和文件,我如何使用並發以提高性能?

我試圖創建一個處理每個子目錄的線程,但是如果有許多嵌套的子目錄,我的線程用完了

如果我們有很多子目錄,使用固定大小的線程池也會有問題。為了提高性能,在這里使用線程的最佳方法是什么?

如果我們有許多子目錄,使用固定大小的線程池也是有問題的

這是一個假設 ,它只是:錯誤。

假設限制因素是線程數。 但是是什么讓你這么想? 此操作的其他元素更有可能限制整體性能,例如分別操作文件系統活動。 確切地說:文件系統下面的驅動系統。

你看,你不能通過向它們拋出(無限數量)線程來使任意問題變得更快

如果你對表現很認真,就不要再做假設了。 相反,開始測量。 測試1個線程需要多長時間“處理”更大的樹。 反復這樣做(最有可能的文件系統緩存將在這里發揮重要作用)。 然后看看如果使用固定線程池會發生什么變化。

我的假設是:你會看到一定的加速,但相當快,添加更多線程會再次減慢速度。 在這里猜測:一個包含4個,最多8個線程的池可能會給你“最佳”結果。

實現方面,你可以放置需要在隊列上進行爬網的“新”子目錄,然后你的工作線程將它們從隊列中取出來進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM