任何人都可以帮助调整此方法吗?当我记录"文件" - 它只需要大约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;
}
答案 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与路径查找器一起使用。这在服务器端完成了很多工作,并且已经积累了。