Tôi có một vấn đề đơn giản: Tôi lặp cấu trúc thư mục lớn và sâu sắc lồng nhau sử dụng Files.walkFileTree
như thế này:Efficently tìm tập tin trong thư mục cụ thể
final int CUTOFF = 5;
final List<Path> foundList = new ArrayList<>();
Files.walkFileTree(codeRoot, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
String rPath = codeRoot.relativize(dir).toString();
int level = rPath.length() - rPath.replace("/", "").length();
if (dir.getFileName().toString().equals("target") || level < CUTOFF) {
return FileVisitResult.CONTINUE;
}
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
if (file.getFileName().toString().endsWith(".txt")) {
foundList.add(file);
}
return FileVisitResult.CONTINUE;
}
});
Mục tiêu của tôi là để thêm tất cả các file dưới một thư mục cụ thể target
mà tôi biết tối đa là CUTOFF
cấp dưới codeRoot
.
Tôi đang tìm cách hiệu quả hơn để thực hiện việc này về các cuộc gọi stat()
cần thiết hoặc ai đó nói "không thể thực hiện".
Cấp độ ngôn ngữ là Java8.
Tại sao bạn nghĩ rằng nó có thể được thực hiện? walkFileTree sử dụng NIO có nghĩa là nó không thường xuyên như đi bộ bản địa về hiệu suất. Nếu bạn gọi điều này thường xuyên, bạn có thể sử dụng một số cache. Một ví dụ về bộ đệm: thời gian sửa đổi cuối cùng của thư mục (trong một số hệ thống tập tin) để lưu vào bộ nhớ cache các thư mục không thay đổi kể từ lần gọi cuối cùng. –
@MladenAdamovic Tôi chủ yếu nghĩ rằng tôi có thể thiếu một số thuật toán ngắn-cắt, kể từ khi thực hiện của tôi là ngây thơ như nó được. Ngoài ra, tôi không có đầu mối nếu 'relativize()' có tác động đến hiệu suất fs mà tôi có thể tránh được. Ý tưởng của bạn về tối ưu hóa chạy lặp lại là một điều tốt, cảm ơn! – mabi
Bạn đang sử dụng gì làm thước đo tốc độ? Bạn đã thực hiện một giải pháp tương tự trong C/C++ làm điểm tham chiếu chưa? Tại sao bạn nghĩ rằng nó không hiệu quả cho đến nay? – Fallso