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));
}
}
什麼「的搜索範式」你試過嗎?你爲什麼認爲這很慢,應該改進?僞代碼或實際代碼更好,因爲它會吸引更好的答案。 – tucuxi
@tucuxi:目前,我正在查看列出超過600萬個文件的服務器目錄。我很不知所措,我不想去想。總之,我還沒有嘗試過任何東西。但作爲後面的想法,我打算在「hashmap」中列出目錄中的所有文件,然後遍歷它以查找重複項。我提出了這個問題,以便了解是否有更聰明的方法來做到這一點,然後簡單地遍歷文件列表,這可能是昂貴的文件的大量文件。 – avi
首先要做的事情是讓它變小。你可以調整上傳過程,以便它們創建更多的目錄和更少的文件?你可以在轉移文件後將文件移動到另一個導入點嗎? – EJP