Tôi hiện đang phát triển ứng dụng đồ họa 3D bằng cách sử dụng JOGL (liên kết Java OpenGL). Tóm lại, tôi có một tệp nhị phân phong cảnh khổng lồ. Do kích thước của nó, tôi phải truyền các khối địa hình trong thời gian chạy. Do đó, chúng tôi thấy rõ mối quan tâm truy cập ngẫu nhiên. Tôi đã hoàn thành việc thực hiện đầu tiên (và bẩn :)) (có lẽ nó là đa luồng), nơi tôi đang sử dụng một cách tiếp cận ngu ngốc ... Đây là khởi tạo của nó:Truyền tệp trong Java
dataInputStream = new DataInputStream(new BufferedInputStream(fileInputStream,4 * 1024);
dataInputStream.mark(dataInputStream.available());
Và khi tôi cần phải đọc (stream) đoạn đặc biệt (tôi đã biết nó "bù đắp" trong tập tin) tôi đang thực hiện như sau (xấu hổ về tôi :)):
dataInputStream.reset();
dataInputStream.skipBytes(offset);
dataInputStream.read(whatever I need...);
Kể từ khi tôi đã có chút kinh nghiệm đó là người đầu tiên điều tôi có thể nghĩ đến :) Vì vậy, cho đến bây giờ tôi đã đọc 3 bài viết hữu ích và khá thú vị (tôi đề nghị bạn đọc chúng, có lẽ nếu bạn quan tâm đến chủ đề này)
Byte Buffers and Non-Heap Memory - Ông Gregory có vẻ là biết chữ trong Java NIO.
Java tip: Làm thế nào để đọc các tập tin một cách nhanh chóng [http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly] - Đó là một mốc thú vị.
bài viết: Tuning Java I/O Hiệu suất [http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/] - khuyến nghị đơn giản Sun, nhưng hãy cuộn xuống và có một cái nhìn tại " Truy cập ngẫu nhiên "ở đó; chúng cho thấy việc thực hiện đơn giản RandomAccessFile (RAF) với khả năng tự đệm.
Ông Gregory cung cấp một số tệp * .java ở cuối bài viết của mình. Một trong số đó là điểm chuẩn giữa FileChannel + ByteBuffer + Mapping (FBM) và RAF. Anh nói rằng anh nhận thấy tốc độ tăng gấp 4 lần khi sử dụng FBM so với RAF. Tôi đã chạy điểm chuẩn này trong các điều kiện sau:
- Khoản bù trừ (khoảng cách truy cập) được tạo ngẫu nhiên (trong phạm vi tệp, ví dụ: 0 - file.length());
- Kích thước tệp là 220MB;
- 1 000 000 truy cập (75% đọc và 25% viết)
Kết quả thật đáng kinh ngạc:
~ 28 giây cho RAF! ~ 0,2 giây đối với FBM!
Tuy nhiên, việc triển khai RAF trong điểm chuẩn này không tự đệm (bài viết thứ 3 nói về một), vì vậy tôi đoán đó là phương thức "RandomAccessFile.seek".
Ok, bây giờ sau khi tất cả những điều tôi đã học được có 1 câu hỏi và 1 tiến thoái lưỡng nan :)
Câu hỏi: Khi chúng tôi đang lập bản đồ một tập tin sử dụng "FileChannel.map" không Java sao chép toàn bộ tập tin nội dung vào MappedByteBuffer? Hay nó chỉ mô phỏng nó?Nếu nó sao chép, sau đó sử dụng cách tiếp cận FBM là không thích hợp cho tình hình của tôi, phải không?
Dilemma: Phụ thuộc vào câu trả lời của bạn về vấn đề ...
Nếu bản đồ sao chép một tập tin, sau đó nó có vẻ như tôi chỉ có 2 giải pháp khả thi để đi: RAF + tự đệm (một từ bài viết thứ 3) hoặc sử dụng vị trí trong FileChannel (không có ánh xạ) ... Cái nào sẽ tốt hơn?
Nếu ánh xạ không sao chép tệp, thì tôi có 3 tùy chọn: hai tùy chọn trước đó và FBM chính nó.
Chỉnh sửa: Đây là một câu hỏi nữa. Một số bạn ở đây nói rằng ánh xạ không sao chép tệp vào MappedByteBuffer. Ok sau đó, tại sao tôi không thể ánh xạ 1GB tệp sau đó, tôi nhận được thông báo "không thể lập bản đồ" ...
PS Tôi muốn nhận được câu trả lời hoàn chỉnh với lời khuyên, vì tôi không thể để tìm thông tin nhất quán về chủ đề này trên internet.
Cảm ơn :)
Nếu bạn nói rằng MappedByteBuffer là một con trỏ đến HD, thì làm thế nào nó đạt được kết quả tốt như vậy trong điểm chuẩn? Tính năng tăng tốc duy nhất có thể có trong IO mà cá nhân tôi biết là TRUY CẬP TRUY CẬP DISK NHƯNG CÓ THỂ KHẢ NĂNG và giải pháp duy nhất ở đây là đệm. Một lần nữa, nếu bạn biết chữ đầy đủ về mối quan tâm này, vui lòng chi tiết hơn. –
@Haroogan Tôi trích dẫn từ bài viết đó: "sự khác biệt gần như hoàn toàn do các công tắc ngữ cảnh hạt nhân" – someguy
Bạn phải nói đùa bằng cách giới thiệu tôi với javadoc, phải không? Coz, không có thông tin cụ thể mà tôi yêu cầu. Tôi vẫn chưa có bất kỳ câu trả lời trực tiếp hoặc ý tưởng thích hợp và ý kiến về các giải pháp có thể. –