微调方法listFiles

时间:2016-04-21 08:49:52

标签: java hdfs

任何人都可以帮助调整此方法吗?当我记录"文件" - 它只需要大约5秒钟。但是在返回" fileInfo"

之前需要超过10分钟
// fileSystem is HDFS
// dateNow = java.util.Date
// basePath = new Path("/")
// filePattern = "*.sf"

private Map<String, Long> listFiles(final Date dateNow, final Path basePath, 
    final String filePattern) throws IOException {

    RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(basePath, true);
    _LOG.info("files=" + files);

    // map containing <filename, filesize>
    Map<String, Long> fileInfo = new HashMap<String, Long>();
    String regex = RegexUtil.convertGlobToRegex(filePattern);
    Pattern pattern = Pattern.compile(regex);

    if (files != null) {
        while (files.hasNext()) {
            LocatedFileStatus file = files.next();
            Path filePath = file.getPath();
            // Get only the files with created date = current date
            if (DateUtils.truncate(new Date(file.getModificationTime()), 
                java.util.Calendar.DAY_OF_MONTH).equals(dateNow)) {
                if (pattern.matcher(filePath.getName()).matches()) {
                    fileInfo.put(file.getPath().getName(), file.getLen());
                }
            }
        }
    }

    _LOG.info("fileInfo =" + fileInfo);
    return fileInfo;
}

2 个答案:

答案 0 :(得分:2)

你说

当我记录&#34;文件&#34; - 它只需要大约5秒

 RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(basePath, true);

即可。因为代码的这一部分只检查该路径上存在的File(例如: - no.Of文件,大小)状态没有查看文件包含的内容和数据量。

现在,如果你研究这部分代码

 while (files.hasNext()) {
            LocatedFileStatus file = files.next();
            Path filePath = file.getPath();
            // Get only the files with created date = current date
            if (DateUtils.truncate(new Date(file.getModificationTime()), 
                java.util.Calendar.DAY_OF_MONTH).equals(dateNow)) {
                if (pattern.matcher(filePath.getName()).matches()) {
                    fileInfo.put(file.getPath().getName(), file.getLen());
                }
            }
        }

然后你分析它在List中的所有文件的整个内容中迭代。所以,绝对比前一个花费更多的时间。此files可能包含许多不同大小Content的文件。

因此,迭代到每个文件内容肯定会花费更多时间。它还取决于此目录包含的文件的大小。文件越大,这个循环花费的时间就越多。

答案 1 :(得分:0)

listStatus与路径查找器一起使用。这在服务器端完成了很多工作,并且已经积累了。