2011-10-09 21 views

Odpowiedz

9

Zajmuję się tworzeniem rozwiązanie, aby być o wiele szybciej, ale nie proponuję użyć go jeszcze tak jak to tylko dowód koncepcji na tym etapie.

http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html

Jednak jeśli masz konkretne wymagania, może łatwiej będzie go zakodować sobie, aby korzystać bezpośrednie ByteBuffers lub pamięci mapowane pliki.

np.

// 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(); 

Możesz zrobić podobnie dla plików mapowanych w pamięci. Pliki mapowane w pamięci nie wliczają się do twojego bezpośredniego limitu pamięci i nie zużywają miejsca wymiany.

Czy jesteś pewien, że BigMemory nie wykona zadania za Ciebie?

+2

Chciałbym bezpłatnie narzędzie, więc BigMemory nie ma stóp. Kodowanie to nie jest takie proste, ponieważ potrzebuję dodawać i usuwać dane z pamięci podręcznej, więc będę musiał kodować skomplikowaną logikę podobną do GC w przydzielonym buforze. – Tema

+1

Przewiń do przodu 6 lat, ten projekt nazywa się teraz [Mapa Kroniki] (https://github.com/OpenHFT/Chronicle-Map) – leventov

14

Istnieje bardzo dobre rozwiązanie pamięci podręcznej o nazwie MapDB (poprzednio JDBM4). Obsługuje HashMap i TreeMap Ale jest to tylko aplikacja osadzona. Obsługuje również stałą pamięć podręczną opartą na plikach.

Przykład sterty wyłączyć cache:

DB db = DBMaker.newDirectMemoryDB().make(); 
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache"); 

lub uporczywe plik cache oparta:

DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make(); 
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache"); 
+1

To rozwiązanie z dyskiem twardym. Naprawdę nie o to pytam. – Tema

+4

@Tema: Obsługuje oba. –

+0

Warto wspomnieć, że MapDB został opracowany w Kotlin i nałoży na niego zależność. –

8

miewam to pytanie ja tak mam właśnie zamiar zaktualizować wcześniejsze odpowiedzi z moje odkrycia.

Znalazłem ten wątek od Quora który mówi także o tym samym pytaniem:

http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache

Odmienne rozwiązanie, które wydaje się być dobrym rozwiązaniem, oprócz directmemory (który tak naprawdę nie został zaktualizowany w w ubiegłym roku) są

  • MapDB - to wydaje się być bardzo kompletne rozwiązanie, które ma o wiele więcej niż buforowanie off-sterty i obsługuje wiele funkcji
  • Ogromne Kolekcje - Wydaje się, że to znacznie mniej skomplikowana aplikacja niż MapDB, która koncentruje się na przydzielaniu danych off-sterty poprzez rozszerzanie ConcurrentMap i Map. Rozwidleniem tego projektu, przeznaczonym dla Javy 8, jest Chronicle-Map.Miły artykuł na ten temat to http://blog.shinetech.com/2014/08/26/using-hugecollections-to-manage-big-data/
  • SpyMemcached - jest to bardzo prosta implementacja jednowątkowa z dobrą reputacją na github.
  • xmemcached - to również ma uczciwą reputację na githubie, ale nie wydaje się być bardzo omawiane.
  • Szybkie serializacji - koncentruje się również na reimplementing Java serializacji z naciskiem na wykorzystanie off-stercie pamięci - http://ruedigermoeller.github.io/fast-serialization/

Jednak byłbym zainteresowany ponadto znaleźć wystarczająco duży aplikację, która korzystając z jednej z tych trzech: directmemory, SpyMemcached, xmemcached. Jeśli znajdę jedną, zaktualizuję tę odpowiedź.

3

Ta implementacja pamięci podręcznej java off-sterty wykorzystuje bezpośredni pamięci i zapewnia dobre osiągi w bibliotece java lekkiego:

https://github.com/snazy/ohc

Spójrz na odcinku benchmarkingu numerów wydajności. Jest licencjonowany na mocy Apache 2.

Powiązane problemy