【发布时间】:2018-08-31 06:15:11
【问题描述】:
我有一个包含大约 300 万个文件的目录。每天一次,我需要运行一个进程来创建一个单独的文件,该文件包含来自具有.html 扩展名的大目录中的文件名。通常,在 300 万个文件中,有 500,000 个将具有 .html 扩展名。我正在使用以下内容:
find dirname -name "*.html"
但是,这会在完成之前运行大约 3 小时。有没有更快的方法来做到这一点?
更新:我用 Perl 和 Java 做了一些测试。使用 Perl 获取此目录的内容并创建 .html 的文件我尝试了以下(注意时间):
my @files = </$dirname/*.html> # 45 minutes
当我使用 Java 尝试此操作时:
final File[] files = dirname.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".html");
}
});
与 Perl 或我能想到的任何 Unix 命令相比,Java 是如何在 3 分钟内完成这项工作的?
【问题讨论】:
-
此目录中包含的文件非常小。每个文件平均 400k。
-
ls和find会因为文件数量而达到缓冲区限制,并且需要进行多次调用。您可以使用更大的缓冲区编写自己的ls版本。 -
我将如何编写自己的 ls?
-
看起来你已经用 Java 写过一篇了!
-
你应该引用更多的代码。例如
find directory -name '*.html' -exec echo {} \; >>listfile比find directory -name '*.html' >listfile慢