我正在用Java实现一个文件传输工具,它将传输一些' X'没有。文件,其中' X'可由用户从一个SFTP服务器配置到另一个SFTP服务器。传输位有效,但它可能会拾取重复的文件(逻辑尚未到位)。
现在SFTP_source服务器每天收到几十万个文件,我无法弄清楚如何执行快速搜索以避免在源服务器上这个庞大的文件列表中重复文件传输。
或者还请建议,如果没有执行昂贵的搜索操作,是否有更好,更快的方法来实现这一目标?如果搜索文件名是唯一的方法,那么使用什么样的搜索范例?
感谢。
答案 0 :(得分:1)
6M文件不是那个多少内存。在实验上,将前6M自然数的字符串表示添加到HashSet<String>
与-Xmx1G
一起使用,并使-Xmx512M
失败;它在我的机器上只需2.5秒(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));
}
}