【问题标题】:Is it more efficient to search a file tree using hashing?使用散列搜索文件树是否更有效?
【发布时间】:2014-10-15 11:13:06
【问题描述】:

所以我正在尝试优化我正在使用的一些代码。该代码是为网站生成器编写的有点通用的搜索实用程序。

目前,搜索通过给定的基本目录递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或它找到的任何非目录的第一个实例。

例如:

public static File findFile(File baseDir, String name) throws IOException{

    File match = null;
    for (File f : findFiles(baseDir, name)){
        if (match == null || 
                match.isDirectory() || 
                matchesFile(name, f) > matchesFile(name, match)){
            match = f;
        }
    }
    return match;
}

public static Set<File> findFiles(File baseDir, String name) throws IOException{

    Set<File> files = new HashSet<File>();

    for (File f : baseDir.listFiles()){

        if (!f.isDirectory()){
            if (matchesFile(name, f) > 0){
                files.add(f);
            }
        }else{              
            files.addAll(findFiles(f, name));

            if (matchesFile(name, f) > 0){
                files.add(f);
            }
        }
    }

    if (matchesFile(name, baseDir) > 0){
        files.add(baseDir);
    }

    return files;
}

由于这是一个相当大的构建,需要长达一个小时,而且我的机器相当慢,我想对其进行一些优化。我想我知道我在做什么,但我实际上不知道这是否会更快。 我正在考虑像这样更改代码:

public static File findFile(File baseDir, String name) throws IOException{

    File match = null;
    if(!baseDirHash.containsKey(baseDir.getAbsolutePath())){
        baseDirHash.put(baseDir.getAbsolutePath(), baseDir);
        hashBaseDir(baseDir, baseDir);
    }

    match = baseDirHash.get(baseDir.getAbsoluteFile() + name);

    if(match == null || !match.exists()){
        for (File f : findFiles(baseDir, name)){
            if (match == null || 
                    match.isDirectory() || 
                    matchesFile(name, f) > matchesFile(name, match)){
                match = f;
            }
        }
    }

    if(!match.isDirectory()){
        baseDirHash.put(baseDir.getAbsoluteFile() + name, match);

    }

    return match;
}
...
private static void hashBaseDir(File baseDir, File currentDir) throws IOException{

    for (File f : currentDir.listFiles()){

        if (!f.isDirectory()){

            baseDirHash.put(baseDir.getAbsolutePath() + f.getName(), f);

        }else{

            hashBaseDir(baseDir, f);

        }
    }
}

任何有关使我的代码更优化或我没有想到的问题的支持或信息都会很棒。

【问题讨论】:

  • 你试过在Java中使用FileVisitor接口吗?您不必为此重新发明轮子。 docs.oracle.com/javase/tutorial/essential/io/walk.html
  • 您尝试过find 实用程序吗?它已被彻底调整。 find . -type d -name foo 应该产生所有名为 foo 的目录。
  • @MikeSamuel-但是,为什么他需要 find 的 unix/linux 实用程序在 java 中。我认为不存在任何联系。你是在建议他参考find命令的代码吗?
  • @shekharsuman,不。我是说使用经过测试和优化的实用程序比编写、优化和调试 Java 程序更容易解决他的特定问题。
  • @MikeSamuel-实际上他已经提到他正在做这一切作为项目的一部分!我读错了吗?可能没有!无论如何,不​​要感觉它,这只是一个戳......

标签: java search hashmap


【解决方案1】:

我最终只是实现了它,它快了大约 400%。

编辑: 一些改进整体代码的优化。

注意:此代码不是线程安全的,因为我使用的是静态方法和变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多