文件列表中的有效方法,我有以下情況,需要加以解決的效率,什麼是比較客戶端和遠程服務器
我做的文件同步,從客戶端設備到服務器。由於服務器存在一些問題,有時會發生某些設備中的文件無法從服務器獲取到其他設備。我需要確保服務器中的所有文件都使用單獨的線程同步到所有客戶端設備。我正在使用C++進行客戶端到服務器通信的開發和libcurl。
在客戶端設備中,我們在SQLite數據庫中有一個用於下載文件的條目。同樣在服務器中,我們也在服務器數據庫(MySQL)中也有類似的更新。我需要列出來自客戶端設備的所有可用文件並將其發送給服務器,並且必須將其與來自服務器數據庫的列表進行比較以找出錯過的文件。
我做了一個粗略的估計,對於100萬個文件列表(文件名全路徑),大小約爲85 MB。壓縮後,它可以達到10 MB的大小。因此,將整個文件列表(即使在壓縮之後)從客戶端傳輸到服務器並不是一個好主意。我打算爲此實現Bloom Filter,如下所示,
- 從客戶端數據庫獲取文件列表並將它們轉換爲Bloom Filter Data Structure。
- 僅將bloom數據結構從客戶端傳輸到服務器。
- 從服務器端數據庫獲取文件列表,並將其與來自客戶端的Bloom數據結構進行比較,找出丟失的文件。
請注意,從客戶端發起的上述過程應該在線程中定期處理,每隔1小時左右處理一次。
布盧姆過濾器的問題是假陽性率,即使它非常低。我不想錯過任何一個文件。還有其他更好的方法嗎?
我會做類似[rsync](http://en.wikipedia.org/wiki/Rsync#Algorithm)。或者,甚至只是使用'rsync'。 –
感謝您的回答。我知道rsync算法,它僅用於將更改的塊發送到遠程服務器,從而減少帶寬使用。即使我已經使用這個librsync發送修改後的文件內容到服務器。你能告訴我如何使用rsync來解決我上面提到的問題嗎? – Prabu
「因此,將整個文件列表(即使在壓縮之後)從客戶端傳輸到服務器並不是一個好主意」。嗯。只傳送文件列表中的*改變的數據..現在什麼會對此有好處?也許..'rsync'? – WhozCraig