2012-11-29 43 views
5

Tôi đang làm việc trên một số mã Java mà cuối cùng sẽ được sử dụng trong máy chủ ứng dụng để truy cập một số tệp thực sự lớn (trên 1GB, dưới 20 GB), có thể được lưu trữ trên NFS chia sẻ. Phục vụ một yêu cầu cá nhân sẽ bao gồm việc thực hiện điều này:java.io.RandomAccessFile khả năng mở rộng (hoặc các tùy chọn khác)

  1. Tìm các tập tin lớn, tôi cần phải đọc
  2. Navigate to một điểm ngẫu nhiên trong tập tin đó
  3. đọc byte từ tập tin đó (thường là dưới 1MB)
  4. Quay trở lại những byte

tôi có một số mã POC đơn giản hạnh phúc tại thời điểm mà chỉ đơn giản mở một file read-only mới và đóng nó:

RandomAccessFile raf=new RandomAccessFile(myFileName, "r"); 
try{ 
    byte[] buffer = new byte[size]; 
    raf.seek(position); 
    raf.reafFully(buffer); 
    return buffer; 
} 
finally{ 
    raf.close(); 
} 

Tôi tự hỏi liệu đây có phải là một cách tiếp cận đơn giản, thanh lịch nên hoạt động tốt hay một cách tiếp cận đơn giản ngu xuẩn sẽ có rất nhiều vấn đề dưới tải nặng (và có lẽ tôi cần tạo một nhóm an toàn độc giả, v.v.) Rõ ràng thử nghiệm giả định đó sẽ là tốt nhất, nhưng tôi đã tự hỏi nếu có bất kỳ thực hành tốt nhất hoặc các vấn đề được biết đến với một trong hai cách tiếp cận. Cho đến nay tôi đã không thể tìm ra rất nhiều googling ...

Cảm ơn!

PS. Vẫn chưa rõ liệu phiên bản cuối cùng của phiên bản này có được lưu trữ trên Windows hay * nix hay không. Nó cũng không rõ ràng làm thế nào các tập tin lớn sẽ được chia sẻ. PPS. Các máy chủ ứng dụng có thể được định cấu hình trong một cụm, do đó, hai máy chủ ứng dụng khác nhau có thể cần đọc cùng một tệp được chia sẻ lớn cùng một lúc.

+1

có vẻ ổn với tôi. bạn không thể nhận được bất kỳ nhanh hơn, trừ khi bạn bộ nhớ cache các tập tin trên đĩa địa phương hoặc trong bộ nhớ – irreputable

+0

Vì vậy, chi phí mở và phát hành các tập tin xử lý là không đáng kể? Ngay cả trên, nói rằng, một chia sẻ NFS? – Dave

+0

có thể không đáng kể, ngay cả trên các tệp cục bộ. nếu đó là một mối quan tâm, bạn có thể giữ một hồ bơi xử lý. hoặc, giữ 1 'FileChannel' mở, đọc đồng thời bằng' read (dst, position) ' – irreputable

Trả lời

2

Một tùy chọn khác là java NIO, cụ thể là FileChannel. FileChannel cũng có thể điều hướng và nó có thể nhanh hơn RandomAccessFile vì nó có thể làm việc với bộ đệm trực tiếp. Nó có một số tính năng thú vị hơn, ví dụ như nó bị gián đoạn.

+0

Cuộc gọi tốt. Vâng, tôi đã thử nghiệm với những người đó. Dường như nó nhanh hơn đáng kể, nhưng không đủ nhanh để đảm bảo tính phức tạp trong * trường hợp sử dụng cụ thể này. Tôi thực sự đã bị đốt cháy bởi nio gần đây do một cửa sổ vật lý rò rỉ bộ nhớ trong JVM trên một ứng dụng khác, vì vậy tôi đã được một chút do dự để sử dụng nó kể từ đó. Thành thật mà nói, nếu phương pháp tiếp cận ngẫu nhiên thực hiện dưới tải cũng như trên các thử nghiệm luồng đơn, nó hoàn hảo cho tôi. – Dave

+0

Phải, vẫn kiểm tra điều này nếu chưa http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness –

Các vấn đề liên quan