2017-05-25 42 views
-1

我正在實現一個Java中的文件傳輸工具,它將傳輸一些'X'no。的文件,其中'X'可由用戶從一臺SFTP服務器配置到另一臺。傳輸位工作,但它可能會拾取重複的文件(邏輯尚未到位)。什麼是在一個大目錄中搜索的最快方法

現在,SFTP_source服務器每天接收數十萬個文件,我無法弄清楚如何執行快速搜索以避免源服務器上這個巨型文件列表中的重複文件傳輸。

或者請也建議是否有更好,更快的方法來實現這一點,而不需要執行昂貴的搜索操作?如果通過文件名進行搜索是唯一的途徑,那麼使用什麼樣的搜索範例?

謝謝。

+0

什麼「的搜索範式」你試過嗎?你爲什麼認爲這很慢,應該改進?僞代碼或實際代碼更好,因爲它會吸引更好的答案。 – tucuxi

+0

@tucuxi:目前,我正在查看列出超過600萬個文件的服務器目錄。我很不知所措,我不想去想。總之,我還沒有嘗試過任何東西。但作爲後面的想法,我打算在「hashmap」中列出目錄中的所有文件,然後遍歷它以查找重複項。我提出了這個問題,以便了解是否有更聰明的方法來做到這一點,然後簡單地遍歷文件列表,這可能是昂貴的文件的大量文件。 – avi

+0

首先要做的事情是讓它變小。你可以調整上傳過程,以便它們創建更多的目錄和更少的文件?你可以在轉移文件後將文件移動到另一個導入點嗎? – EJP

回答

1

6M文件不是多少內存。在實驗中,將前6M自然數的字符串表示添加到HashSet<String>可與-Xmx1G一起使用,並且以-Xmx512M失敗;在我的機器上只需要2.5s(Java 8,64位)。因此使用HashSet肯定是可行的。

如果你願意犧牲速度,通過使用磁盤來存儲索引,你可以大大降低內存佔用。在這種情況下,您可能會更好地使用實際的數據庫 - 它們非常適合對索引和搜索不適合內存的大型集合進行優化。

,我用於測試的代碼:

import java.util.*; 
public class C { 
    public static void main(String ... args) { 
     HashSet<String> hs = new HashSet<>(); 
     long t = System.currentTimeMillis(); 
     for (int i=0; i< 6 * 1000 * 1000; i++) { 
      hs.add("" + i); // add returns "false" if key is already present 
     } 
     System.out.println("Added " + hs.size() + " keys in " 
      + (System.currentTimeMillis()-t)); 
    } 
} 
+0

感謝您的回答。我嘗試了在HashSet中列出所有文件的簡單方法,然後根據循環中最後修改的內容對它們進行排序,結果證明這對我的簡單機器來說是一塊蛋糕。我在兩分鐘之內完成了所有這些工作,這是可以接受的,因爲還有其他操作。使用HashMaps也同樣有效。接下來要看的是如果我能比Filezilla更快地將文件傳輸到SFTP。我打算打開多個並行連接,不確定Filezilla是否已經這樣做。 – avi

+0

通過網絡實時傳輸文件與檢測文件名重複是非常不同的問題。如果你需要幫助,你應該問一個不同的問題(經過一些最初的研究工作)。打開多個連接只有在有剩餘帶寬的情況下才能使用。 – tucuxi

+0

謝謝@tucuxi會做。 – avi

相關問題