Есть ли альтернатива Open Source для Terracotta BigMemory?
На самом деле мне даже не удалось найти какую-либо коммерческую альтернативу. Меня интересует чистое решение Java, которое будет работать внутри JVM без каких-либо решений JNI и C-backed.
Есть ли альтернатива Open Source для Terracotta BigMemory?
На самом деле мне даже не удалось найти какую-либо коммерческую альтернативу. Меня интересует чистое решение Java, которое будет работать внутри JVM без каких-либо решений JNI и C-backed.
Существует очень хорошее решение для кеша MapDB (ранее JDBM4). Он поддерживает HashMap
и TreeMap
Но это только приложение, встроенное. Он также поддерживает постоянный кеш на основе файлов.
Пример для кэша кучи:
DB db = DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache");
Или постоянный кэш на основе файлов:
DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");
Я разрабатываю решение намного быстрее, но я бы не предлагал вам использовать его только пока, поскольку это просто доказательство концепции на этом этапе.
http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html
Однако, если у вас есть конкретное требование, может быть проще запрограммировать его самостоятельно, использовать прямые ByteBuffers или файлы с отображением памяти.
например.
// using native order speeds access for values longer than a byte.
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*1024).order(ByteOrder.nativeOrder());
// start at some location.
bb.position(0);
bb.put((byte) 1);
bb.putInt(myInt);
bb.putDouble(myDouble);
// to read back.
bb.position(0);
byte b = bb.get();
int i = bb.getInt();
double d = bb.getDouble();
Аналогичным образом вы можете использовать файлы с отображением памяти. Файлы с отображением памяти не учитывают ограничение прямой памяти и не используют пространство подкачки.
Вы уверены, что BigMemory не будет работать для вас?
Похоже, есть предложение на apache:
У меня сам был этот вопрос, поэтому я собираюсь обновить предыдущие ответы своими выводами.
Я нашел эту тему от quora, которая также говорит о том же вопросе:
http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache
Разное решение, которое, кажется, хорошо подходит, кроме directmemory (который на самом деле не обновлялся в прошлом году)
Однако мне было бы интересно также найти достаточно большое приложение, которое использует любой из этих трех: directmemory, SpyMemcached, xmemcached. Должен ли я найти его, я обновлю этот ответ.
Хотя это не решение, руководство по использованию ByteBuffers для вашего случая использования написано Китом Грегори. Посмотрите http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf для обзора и http://www.kdgregory.com/index.php?page=java.byteBuffer для подробных подробностей.
Эта реализация кеша java off-heap использует прямую память и обеспечивает хорошую производительность в легкой Java-библиотеке:
Взгляните на раздел бенчмаркинга для номеров производительности. Он лицензирован под Apache 2.