2009-12-15 25 views
5

Giả sử tôi muốn nhận được một số thuộc tính của tệp (chủ sở hữu, kích thước, quyền, thời gian) khi được trả về bởi lệnh gọi hệ thống lstat(). Một cách để làm điều này trong Java là tạo một đối tượng java.io.File và thực hiện các cuộc gọi như length(), lastModified(), v.v. trên đó. Tôi có hai vấn đề cho đến thời điểm này:Unix stat()/lstat() cho Java

  1. Mỗi cuộc gọi này kích hoạt lệnh stat() và cho mục đích của tôi stat() được coi là đắt đỏ: Tôi đang cố quét hàng tỷ tệp song song hàng trăm máy chủ, và (đến một xấp xỉ đầu tiên) cách duy nhất để truy cập các tập tin này là thông qua NFS, thường chống lại các cụm filer mà stat() dưới tải có thể mất nửa giây.

  2. Cuộc gọi không phải là lstat(), thường là stat() (theo sau liên kết tượng trưng) hoặc fstat64() (mở tệp và có thể kích hoạt thao tác ghi để ghi lại thời gian truy cập).

Có cách nào "đúng" để thực hiện việc này, sao cho tôi chỉ thực hiện một cuộc gọi lstat() duy nhất và truy cập các thành viên của chỉ số struct? Những gì tôi đã tìm thấy cho đến nay từ Googling:

  • JDK 7 sẽ có giao diện PosixFileAttributes trong java.nio.file với tất cả mọi thứ tôi muốn (nhưng tôi thà không được chạy đêm xây dựng của JDK của tôi nếu tôi có thể tránh nó).

  • Tôi có thể cuộn giao diện của riêng mình bằng JNI hoặc JNA (nhưng tôi không muốn nếu có giao diện hiện tại).

Một previous similar question có một vài gợi ý JNI/triển khai JNA. Một cái đã biến mất và cái còn lại được duy trì một cách có vấn đề (ví dụ: không tải xuống, chỉ là một kho lưu trữ hg).

Có tùy chọn nào tốt hơn không?

Trả lời

2

Có vẻ như bạn đã bao phủ tất cả các căn cứ. Khi tôi bắt đầu đọc câu hỏi của bạn, suy nghĩ đầu tiên của tôi là JDK 7 hoặc JNI. Không biết gì về mô hình thay đổi trên các tệp này, bạn cũng có thể xem xét một số loại bộ nhớ cache liên tục của thông tin được đề cập, giống như một DB được nhúng. Bạn cũng có thể xem xét một số phương thức truy cập khác ngoài NFS, như một dịch vụ web tùy chỉnh cung cấp thông tin tệp hàng loạt từ một máy chủ từ xa.

+0

Cảm ơn! Cuối cùng tôi đoán JDK 7 không quá tệ; Tôi chỉ có thể giữ các tệp nhị phân bằng công cụ mà tôi đang viết, và nó sẽ là phần mềm cấp sản xuất sớm đủ. –

1

Có, stat() nằm trong tất cả các cuộc gọi và thư viện. Đó là một vấn đề độ trễ. Tuy nhiên, bạn có thể làm nhiều stat() cùng một lúc, vì có rất nhiều trình nền tảng máy chủ NFS để hỗ trợ các kết nối của bạn, sử dụng các luồng trừ khi ai đó có một chỉ số không đồng bộ() lên tay áo của chúng! Nếu bạn có thể nhận được trên máy chủ, giống như với ssh, stat() sẽ rẻ hơn nhiều. Bạn thậm chí có thể viết một dịch vụ tcp để stream trong đường dẫn và stream ra stat(). Thật không may, truy cập vào máy chủ NFS là khó hoặc không thể, vì nó chỉ có thể có tài khoản quản trị, là một Hitachi SAN hoặc một cái gì đó.

+0

Đối với một nền lịch sử ít: các máy chủ NFS trong câu hỏi là một cụm Isilon 5-10PB, cung cấp sự nhất quán nghiêm ngặt về các cuộc gọi stat nhưng với chi phí trễ khủng khiếp dưới tranh chấp. (Tôi vẫn không chắc liệu họ có khóa lớn hay gì phức tạp hơn.) Đây là vấn đề về mức hệ thống tập tin: chúng tôi không làm gì tốt hơn là root. Chúng tôi đã kết thúc chỉ để cho nó mất thời gian của nó thay vì dành một vài ngày của người dân thời gian cố gắng để tiết kiệm một vài ngày của thời gian máy tính. –