我必须处理要处理的大约200万个xml目录。
我已经解决了使用队列在机器和线程之间分配工作的处理过程,一切正常。
但是现在最大的问题是读取目录中的200万个文件以逐步填充队列的瓶颈。
我尝试使用该File.listFiles()
方法,但是它给了我一个Java out of memory: heap space
异常。有任何想法吗?
首先,您是否有可能使用Java 7?那里有一个FileVisitor
和和Files.walkFileTree
,它们应该在内存限制内起作用。
否则,我唯一想到的方法是使用
File.listFiles(FileFilter filter)
始终返回的过滤器
false
(确保文件的完整数组永远不会保存在内存中),但是它会捕获沿途要处理的文件,也许将它们放入生产者/消费者队列或将文件名写入磁盘以供以后遍历。
另外,如果您控制文件的名称,或者以某种不错的方式命名它们,则可以使用接受表单上文件名的过滤器file0000000
(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))
问题内容: 用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 我发