หน้าต่างบานเลื่อน MappedByteBuffer

มีวิธีใดบ้างในการทำให้ MappedByteBuffer มีหน้าต่างเลื่อนบนไฟล์ ฉันมีไฟล์ขนาดใหญ่มาก (20GB) แต่ฉันต้องการสร้างครั้งละ 100MB เท่านั้น ฉันได้ลองสิ่งนี้โดยทิ้งบัฟเฟอร์เก่าและสร้างบัฟเฟอร์ใหม่จากชาแนล แต่สิ่งนี้กินหน่วยความจำเนื่องจากบัฟเฟอร์เก่าดูเหมือนจะไม่ถูกนำมาใช้ซ้ำ

มีความคิดอะไรบ้าง?


person Mike Streeton    schedule 05.03.2012    source แหล่งที่มา


คำตอบ (1)


คุณสามารถบังคับให้บัฟเฟอร์เก่าปล่อยหน่วยความจำได้ทันทีด้วย

((DirectBuffer) buffer).cleaner().clean();

ข้อจำกัดความรับผิดชอบ: ฉันใช้สิ่งนี้กับ Sun/Oracle/OpenJDK Java 6 อัปเดต 18 และใหม่กว่าเท่านั้น อาจใช้งานไม่ได้หรือทำงานไม่ถูกต้องกับเวอร์ชันเก่าหรือแพลตฟอร์มอื่นๆ ขอบคุณ @EJP .


เว้นแต่ว่าคุณมีระบบปฏิบัติการ 32 บิต ฉันจะแมปไฟล์ทั้งหมดลงในหน่วยความจำ (โดยใช้การแมปหลายรายการ) ซึ่งจะมีประสิทธิภาพและจัดการง่ายกว่ามาก ในสถานการณ์นี้ ฉันจะล้างข้อมูล ByteBuffers โดยเป็นส่วนหนึ่งของการปิดไฟล์เท่านั้น (ในการทดสอบหน่วย)

คุณสามารถใช้หน่วยความจำเสมือน TB และใช้พื้นที่ทางกายภาพหรือดิสก์เพียงเล็กน้อยได้ ในตัวอย่างนี้ ฉันจับคู่หน่วยความจำเสมือนขนาด 8 TB บนเครื่องที่มีหน่วยความจำ 24 GB และไดรฟ์ขนาด 120 GB

http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

โดยสรุป: บนหน่วยความจำเสมือนของเครื่อง 64 บิตนั้นมีราคาถูกอย่างเหลือเชื่อ ไม่ใช่สิ่งที่คุณต้องกังวล

BTW: เครื่อง 64 บิตส่วนใหญ่จริงๆ แล้วจำกัดอยู่ที่ 48 บิตของหน่วยความจำเสมือน นี่เป็นขีดจำกัดที่ 256 TB แทนที่จะเป็น 16 EB (18,000,000 TB) ที่สามารถระบุได้ในทางทฤษฎี


คุณอาจพบว่าห้องสมุดนี้น่าสนใจ ฉันไม่ได้พูดถึงมันมาก่อนเพราะมันอาจไม่เหมาะกับคุณ แต่คุณอาจพบว่าแนวทางและเทคนิคบางอย่างที่ฉันใช้ในโค้ดน่าสนใจ

https://github.com/peter-lawrey/Java-Chronicle

person Peter Lawrey    schedule 05.03.2012
comment
คุณควรระบุว่า DirectBuffer และคลาสอื่นๆ ที่ใช้ที่นี่เป็นคลาส sun.misc.* ทั้งหมด ดังนั้นจึงอยู่ภายใต้คำเตือนตามปกติ ฉันเห็นทั้งหมดนี้เป็นครั้งแรกโดยเกี่ยวข้องกับ 1.4: มันยังใช้งานได้จริงหรือ? - person user207421; 06.03.2012
comment
@EJP ดังที่คุณได้ชี้ให้เห็นแล้ว มันจะไม่ทำงานในทุกระบบ อย่างไรก็ตามบน Sun/Oracle และ OpenJDK JVM อย่างน้อยก็ทำงานได้ดีมาก ฉันใช้แนวทางนี้ในการผลิตมาประมาณสองปีแล้ว (และงานที่แตกต่างกันสองงาน) - person Peter Lawrey; 06.03.2012
comment
เร็วที่สุดน่าจะเป็น Java 6 อัปเดต 18 ซึ่งเป็น Java 7 อัปเดต 3 ล่าสุด เป็นคำถามที่น่าสนใจว่าจะใช้งานได้กับทุกเวอร์ชันที่มี NIO (ตั้งแต่ Java 1.4 ขึ้นไป) - person Peter Lawrey; 06.03.2012