Jendela geser MappedByteBuffer

Apakah ada cara untuk membuat MappedByteBuffer memiliki jendela geser pada suatu file. Saya memiliki file yang sangat besar (20GB) tetapi saya hanya ingin membuat 100MB dalam satu waktu. Saya telah mencoba ini hanya dengan membuang buffer lama dan membuat yang baru dari chanel, tetapi ini memakan memori karena buffer lama sepertinya tidak digunakan kembali.

Ada ide?


person Mike Streeton    schedule 05.03.2012    source sumber


Jawaban (1)


Anda dapat memaksa buffer lama untuk segera melepaskan memorinya

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

Penafian: Saya hanya menggunakan ini dengan pembaruan Sun/Oracle/OpenJDK Java 6 18 dan yang lebih baru. Ini mungkin tidak tersedia atau berfungsi dengan benar dengan versi lama, atau platform lain. Terima kasih @EJP.


Kecuali Anda memiliki OS 32-bit, saya hanya akan memetakan seluruh file ke dalam memori (menggunakan beberapa pemetaan) Ini akan jauh lebih efisien dan mudah untuk dikelola. Dalam situasi ini saya hanya membersihkan ByteBuffers sebagai bagian dari penutupan file (dalam pengujian unit)

Anda dapat menggunakan memori virtual sebesar TB dan menggunakan sedikit ruang fisik atau bahkan ruang disk. Dalam contoh ini, saya memetakan memori virtual 8 TB pada mesin dengan memori 24 GB dan drive 120 GB.

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

Singkatnya: pada mesin 64-bit, memori virtual sangatlah murah, ini bukan sesuatu yang perlu Anda khawatirkan.

BTW: Kebanyakan mesin 64-bit sebenarnya terbatas pada memori virtual 48-bit. Batasan ini adalah 256 TB, bukan 16 EB (18.000.000 TB) yang dapat mereka atasi secara teori.


Anda mungkin menganggap perpustakaan ini menarik. Saya tidak menyebutkannya sebelumnya karena mungkin tidak cocok untuk Anda, tetapi Anda mungkin menganggap pendekatan dan beberapa teknik yang saya gunakan dalam kode menarik.

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

person Peter Lawrey    schedule 05.03.2012
comment
Anda harus menyatakan bahwa DirectBuffer dan kelas-kelas lain yang diandalkan di sini semuanya adalah kelas sun.misc.* dan oleh karena itu tunduk pada peringatan biasa. Saya pertama kali melihat semua ini terkait dengan 1.4: apakah ini masih berfungsi? - person user207421; 06.03.2012
comment
@EJP, Seperti yang telah Anda tunjukkan, ini tidak akan berfungsi di semua sistem. Namun pada JVM Sun/Oracle dan OpenJDK setidaknya itu berfungsi dengan sangat baik. Saya telah menggunakan pendekatan ini dalam produksi selama sekitar dua tahun (dan dua pekerjaan berbeda). - person Peter Lawrey; 06.03.2012
comment
Yang paling awal adalah pembaruan Java 6 18, pembaruan Java 7 terbaru 3. Ini adalah pertanyaan menarik apakah ini berfungsi untuk semua versi yang memiliki NIO (dari Java 1.4 ke atas) - person Peter Lawrey; 06.03.2012