【问题标题】:What is the quickest way to search in a large directory在大目录中搜索的最快方法是什么
【发布时间】:2017-10-26 15:52:12
【问题描述】:

我正在用 Java 实现一个文件传输工具,它将传输一些“X”号。文件,其中“X”可由用户从一个 SFTP 服务器配置到另一个。传输位有效,但它可能会拾取重复文件(逻辑尚未到位)。

现在 SFTP_source 服务器每天接收数十万个文件,我无法弄清楚如何执行快速搜索以避免在源服务器上这个庞大的文件列表中重复文件传输。

或者还请建议是否有更好、更快的方法来实现这一目标,而无需执行昂贵的搜索操作?如果通过文件名搜索是唯一的方法,那么使用什么搜索范例?

谢谢。

【问题讨论】:

  • 你尝试过什么“搜索范式”?为什么你认为它很慢并且应该改进?伪代码或实际代码更好,因为它会吸引更好的答案。
  • @tucuxi:目前,我正在查看列出超过 600 万个文件的服务器目录。我太不知所措了,我不想去想。简而言之,我还没有尝试过任何东西。但作为事后的想法,我打算在“哈希图”中列出目录中的所有文件,然后简单地遍历它以查找重复项。我提出了这个问题,以便了解是否有更聪明的方法可以做到这一点,然后简单地遍历文件列表,考虑到大量文件,这可能会很昂贵。
  • 对大的东西要做的第一件事就是把它变小。您可以调整上传过程,以便在每个目录中创建更多目录和更少文件吗?转移文件后能否将它们移动到另一个目录中?
  • @EJP 这是我需要获得业务流程批准的事情,但是是的,这是一个不错的选择,我会尝试向团队提出建议。谢谢。

标签: java search directory


【解决方案1】:

6M 文件不是 那么 太多的内存。实验上,将前 6M 个自然数的字符串表示形式添加到 HashSet<String>-Xmx1G 一起工作,而与 -Xmx512M 一起失败;在我的机器(Java 8、64 位)上只需要 2.5 秒。因此,使用 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));
    }
}

【讨论】:

  • 感谢您的回答。我尝试了一种简单的方法,即在 HashSet 中列出所有文件,然后根据循环中的最后修改对它们进行排序,结果证明这对我的简单机器来说是小菜一碟。我将在两分钟内完成所有这些工作,这是可以接受的,因为还有其他操作。使用 HashMaps 也同样有效。接下来要看的是我是否可以比 filezilla 更快地将文件传输到 SFTP。我正在考虑打开多个并行连接,不确定 Filezilla 是否已经这样做了。
  • 通过网络快速传输文件与检测文件名重复是一个非常不同的问题。如果你需要帮助,你应该问一个不同的问题(经过一些初步的研究工作)。只有在有剩余带宽的情况下才能打开多个连接。
  • 谢谢@tucuxi 会做的。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多