簡體   English   中英

用Java加速文件md5校驗和

[英]Accelerating files md5 checksum in Java

我正在開發一個管理備份的程序。

為此,我研究了一種方法,該方法對磁盤上每個需要檢查的文件進行哈希處理(MD5),以檢測是否存在副本,因為我想檢測它們並將其告知用戶。 我使用了這里描述的apache庫。

問題在於該程序應管理來自許多不同類型(視頻,音樂,字母,您可能要備份的所有內容)的大量數據,因此散列的時間可能會變得很長(我將1.6 Gb大型視頻的散列時間定為時間) ,大約需要25秒)。

因此,您可以想象對數百個Gig進行哈希運算所需的時間...

我已經嘗試使用線程拆分工作,在“相同”時間內對許多文件進行哈希處理,這是我的run()方法:

public void run() {
    running = true;
    while (running) {
        System.out.println("Thread: " + this.getName() + " starting");
        files = path.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    System.out.println(file.getName());
                    dtm.countDirectory();
                    DetectorThread dt = new DetectorThread(dtm, file);
                    dt.start();
                    dtm.resetTimer();
                } else if (file.isFile()) {
                    String hash = h.hash(file.getAbsolutePath());
                    System.out.println(file.getName() + "\t" + hash);
                    dtm.countFile();
                    dtm.addFile(file, hash);
                    dtm.resetTimer();
                }
            }
        }
        dtm.resetTimer();
        running = false;
        System.out.println("Thread: " + this.getName() + " terminated");
    }
}

您給該線程指定路徑,他將為每個子文件夾啟動另一個線程。

通過這段代碼,我花了35分鍾的時間完成了不到100 Gig的工作,所以我想知道是否有一種更簡單的方法來找到文件的唯一ID,檢測副本,或者是一種更快的哈希方法,或者我做錯了什么線程。

歡迎任何允許加速這種治療的想法。

先感謝您。

PS:我的電腦還不錯,所以它與性能無關。

確實沒有必要對所有內容進行哈希處理。

首先查看文件大小。 如果沒有其他文件具有相同的大小,則檢查已完成,您不會浪費時間掃描整個文件以對其進行哈希處理。

大文件的大小很可能是唯一的,因此您最終可能只對一些較小的文件進行哈希處理。


僅供參考:您的性能很可能完全受磁盤限制,這意味着多線程代碼大部分時間都在等待硬盤返回數據。

您可以通過監視系統來確認。 硬盤指示燈將保持點亮狀態(不會像通常那樣閃爍),並且CPU將處於空閑狀態。

更快的唯一途徑就是少閱讀。

在我看來,這段代碼將創建太多線程。 每個線程創建都有相對較高的成本。

另外,太多的線程同時讀取文件,將導致I / O效率低下:當一個線程讀取一堆數據時,系統通常會在緩存中加載一個完整的塊,以固定即將到來的訪問。 當許多線程同時讀取大塊時,系統將丟棄這些緩存,從而迫使額外的磁盤訪問。

一個快速簡單的修復方法是使用ThreadPool ,將可執行線程的數量限制為一個修復程序號。 理想的數量可能在您的CPU核心數量附近。 您的DetectorThread將必須實現Callable

如果大多數大文件存儲在有限數量的目錄中,您將面臨另一個問題:單個線程必須按順序解析所有文件。 最好讓一個線程遞歸掃描目錄,為每個文件創建一個Callable。

暫無
暫無

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

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