有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java性能优化在文件系统中搜索数据

我有一个与网络相关的存储,其中大约有500万个txt文件,与大约300万个事务相关。总数据量约为3.5 TB。我必须在该位置搜索,以确定交易相关文件是否可用,并且必须制作两份单独的报告,作为CSV文件“可用文件”和“不可用文件”。我们是 仍在Java6中。我面临的挑战是,因为我必须递归地在该位置搜索,由于规模巨大,我在该位置搜索平均需要2分钟左右。我使用JavaI/OAPI进行递归搜索,如下所示。有什么方法可以提高性能吗

File searchFile(File location, String fileName) {
     if (location.isDirectory()) {
         File[] arr = location.listFiles();
         for (File f : arr) {
             File found = searchFile(f, fileName);
             if (found != null)
                 return found;
         }
     } else {
         if (location.getName().equals(fileName)) {
             return location;
         }
     }
     return null;
}

共 (2) 个答案

  1. # 1 楼答案

    您应该采取不同的方法,而不是每次搜索文件时遍历整个目录,而是创建一个索引,它是从文件名到文件位置的映射

    基本上:

    void buildIndex(Map index, File baseDir) {
        if (location.isDirectory()) {
            File[] arr = location.listFiles();
            for (File f : arr) {
                buildIndex(index, f);
            }
        } else {
            index.put(f.getName(), f);
        }
    }
    

    既然已经有了索引,搜索文件就变得很简单了

    现在地图中已经有了这些文件,甚至可以使用集合操作来查找交点:

    Map index = new HashMap();
    buildIndex(index, ...);
    Set fileSet = index.keySet();
    Set transactionSet = ...;
    Set intersection = new HashSet(fileSet);
    fileSet.retainAll(transactionSet);
    

    或者,如果索引本身太大,无法保存在内存中,则可能需要在SQLite数据库中创建索引

  2. # 2 楼答案

    • 在目录或与网络相关的存储中搜索是一项重要任务 噩梦当目录太大/太深时会花费很多时间。在Java 6中, 所以你可以遵循旧的时尚方式。列出CSV文件中的所有文件,如 下面
    • e、 g

      find . -type f -name '*.txt' >> test.csv . (if unix)

      dir /b/s *.txt > test.csv (if Windows)

    • 现在将这个CSV文件加载到地图中,以索引作为文件名。加载文件将需要一些时间,因为它将是巨大的,但一旦你加载,然后在地图中搜索(因为它将是文件名)将更快,并将大大减少你的搜索时间