当前位置: 首页 > 面试题库 >

如何在Java中列出200万个文件目录而又没有“内存不足”异常

苏宏峻
2023-03-14
问题内容

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

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

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

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


问题答案:

首先,您是否有可能使用Java 7?那里有一个FileVisitor和和Files.walkFileTree,它们应该在内存限制内起作用。

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

另外,如果您控制文件的名称,或者以某种不错的方式命名它们,则可以使用接受表单上文件名的过滤器file0000000filefile0001000然后是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))


 类似资料:
  • 问题内容: 用PHP在一个目录中列出所有文件的最佳方法是什么?是否有$ _SERVER函数可以执行此操作?我想列出usernames /目录中的所有文件,并通过链接遍历该结果,以便我可以单击文件名的超链接到达那里。谢谢! 问题答案: 检查一下:readdir() 此代码段应列出某个目录中的所有条目: 编辑 :miah的解决方案比我的解决方案优雅得多,您应该改用他的解决方案。

  • 问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我试图找到一个目录中存在的文件,而不是另一个目录中的文件,我尝试使用以下命令: 与上面的命令,它会找到这两个文件的问题,但不是还有文件而不是在, 我试图在文件中找到文件,但不仅在其中。 这是我的数据的一小部分样本 在我脑海里的另一个问题是,我怎么能找到的文件,而不是在或在一个单一的命令?

  • 问题内容: 列出1000多个目录和子目录中文件名的最快方法是什么? 编辑; 我使用的当前代码是: 问题答案: 看起来不错(递归遍历目录)瓶颈将是您需要执行的所有文件I / O操作,优化Java不会显示任何实际改进。

  • 我正在从命令行运行jmx

  • 问题内容: 我正在开发一个需要大量内存的程序,并且我想在内存不足异常发生时捕获。我听说这是不可能的,但对此是否有所发展感到好奇。 问题答案: 这也不例外。这是一个错误:java.lang.OutOfMemoryError 当它从Throwable下降时,你可以捕获它: 但是,除非你要进行一些相当具体的工作(例如,在特定代码段内分配大量工作),否则你可能将无法捕捉到它,因为你将不知道它将从何处抛出。

  • 问题内容: 如何在Python中列出目录的所有文件并将其添加到中list? 问题答案: 使用Python 2和3获取文件列表 os.listdir() 如何获取当前目录中的所有文件(和目录)(Python 3) 以下是在Python 3中使用 和函数仅检索当前目录中文件的简单方法。进一步的探索将演示如何返回目录中的文件夹,但你不会在子目录中拥有该文件,因此可以使用步行-稍后讨论)。 glob 我发