2016-11-20 5 views
1

私はかなり大きなオブジェクト(複雑なクラスとシリアライズ可能にすることができます)とそのアルゴリズムを操作しています。このアルゴリズムは、各オブジェクトに対して何回も動作しなければならず、一度にコレクションのいくつかのオブジェクトしか必要としない。ディスクへのJavaキャッシュオブジェクト

RAMを節約するために、私はもう十分なメモリがない場合、ディスクにアルゴリズムによってしばらく使われなかったオブジェクトをキャッシュしたいと思います。アルゴリズムは、どのオブジェクトがディスク上にあるかを知る必要があるため、可能な限りそれらを避けることができます。

どうすればよいですか?これを自分で実装する必要があるのですか、既存のライブラリがありますか?

編集:私はできるだけ早くそれらを破棄するので

私はおそらくそれらのオブジェクトの数百以上のものを持っていません。各オブジェクト(簡略化された説明)には、最大256×256要素の2D配列が含まれています。メインアレイの平均負荷は約30%、子アレイはほとんどの場合ほぼ完全であると考えてください。配列内の各オブジェクトには、より小さなデータが含まれています。ベクトルを含む配列リスト、プロパティHashMapなどがあります。ほとんどのデータをインスタンス化してアウトソーシングしたので、かなり小さくなっていました。

+1

これまでにも、何個のオブジェクトについて話していますか?彼らのクラスはどのように見えますか? –

+0

Apacheコモンズにはキャッシュライブラリがあります:http://commons.apache.org/dormant/cache/ – brummfondel

+0

ここで参照できますhttp://www.ehcache.org/documentation/2.7/configuration/fast-restart.html – developer

答えて

1

GitHubの素晴らしい人にMapDBについて言及しました。これは、ユースケースによく合います。それは、メモリ/カウントと時間ベースのアイテムの退去を持っています。ドキュメントもhas an example(「有効期限オーバーフロー」セクション):

DB dbDisk = DBMaker 
     .fileDB(file) 
     .make(); 

DB dbMemory = DBMaker 
     .memoryDB() 
     .make(); 

// Big map populated with data expired from cache 
HTreeMap onDisk = dbDisk 
     .hashMap("onDisk") 
     .create(); 

// fast in-memory collection with limited size 
HTreeMap inMemory = dbMemory 
     .hashMap("inMemory") 
     .expireAfterGet(1, TimeUnit.SECONDS) 
     //this registers overflow to `onDisk` 
     .expireOverflow(onDisk) 
     //good idea is to enable background expiration 
     .expireExecutor(Executors.newScheduledThreadPool(2)) 
     .create(); 
関連する問題