java - 如何在java中列出200万个文件目录而不会出现 "out of memory"异常

标签 java file file-io out-of-memory

我必须处理大约 200 万个要处理的 xml 的目录。

我已经解决了使用队列在机器和线程之间分配工作的处理,并且一切正常。

但现在最大的问题是读取包含 200 万个文件的目录以逐步填充队列的瓶颈。

我尝试使用 File.listFiles() 方法,但它给了我一个 java out of memory: heap space 异常。有什么想法吗?

最佳答案

首先,你有没有可能使用Java 7?你有一个FileVisitorFiles.walkFileTree ,这可能应该在您的内存限制范围内工作。

要不然我能想到的唯一办法就是用File.listFiles(FileFilter filter)使用始终返回 false 的过滤器(确保完整的文件数组永远不会保存在内存中),但这会捕获要处理的文件,并可能将它们放入生产者/消费者队列或将文件名写入磁盘以供以后遍历。

<罢工>

或者,如果您控制文件的名称,或者如果它们以某种不错的方式命名,您可以使用接受格式为 file0000000 的文件名的过滤器以 block 的形式处理文件。 - filefile0001000然后 file0001000 - filefile0002000等等。

如果名称​​没有以这样的方式命名,您可以尝试根据文件名的哈希码过滤它们,这应该是在整数集上相当均匀地分布。


更新: 叹息。恐怕行不通。刚刚看了一下 listFiles 的实现:

public File[] listFiles(FilenameFilter filter) {
    String ss[] = list();
    if (ss == null) return null;
    ArrayList v = new ArrayList();
    for (int i = 0 ; i < ss.length ; i++) {
        if ((filter == null) || filter.accept(this, ss[i])) {
            v.add(new File(ss[i], this));
        }
    }
    return (File[])(v.toArray(new File[v.size()]));
}

所以无论如何它可能会在第一行失败......有点令人失望。我相信您最好的选择是将文件放在不同的目录中。

顺便说一句,你能举一个文件名的例子吗?他们“可以猜到”吗?喜欢

for (int i = 0; i < 100000; i++)
    tryToOpen(String.format("file%05d", i))

关于java - 如何在java中列出200万个文件目录而不会出现 "out of memory"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139073/

相关文章:

java - 通过将文件置于安全的网络连接后面来保护文件

java - 使用 Apache Sqoop 将数据从 MySQL 导入到 MySQL

android - 从 onActivityResult Intent 获取一个或多个文件及其文件名?

java - 在 Java 中将文本文件放入二维不规则数组中

java - randomAccessFile.readLine() 在多次使用后返回 null,即使未达到 EOF?

c# - 更快地读取文件并快速获取像素颜色?

java - 合并排序不起作用

java - zk 框架 : how to load zul pages from WEB-INF under directory zul

bash 用于进行数值比较和文件存在

c - 如何使用 strtok 读取 3x3 矩阵 - 我使用了 flex 但我不确定是否允许提交预处理源