2010-03-10 13 views
10

Skończyło się brakować pamięci w Javie z powodu bardzo dużych list i zestawów utworzonych podczas transakcji i powtórzono je tylko raz na samym końcu transakcji. Czy są jakieś biblioteki udostępniające kolekcje Java, które mogą buforować ich przekształcalną zawartość na dysk, gdy rozmiar kolekcji przekroczy określony próg?Kolekcje Java, które przechodzą na dysk

+0

Niezupełnie tego, czego szukasz, zajrzyj na Hadoop http://hadoop.apache.org/ – saugata

+1

Czy jest jakiś powód, dla którego nie używasz standardowego RDBMS? W pewnym sensie jest to definicja tego, o co pytasz. Nawet te lekkie, takie jak h2db, sqlite sprostałyby większości zadań. – dpb

Odpowiedz

4

Można spróbować czegoś podobnego ehcache i jego opcji overflowToDisk

+0

Wiem, że Ehcache nie ma logiki, która odpytuje (pobierz i usuń) elementy z pamięci podręcznej, zgodnie z dokumentacją widzę tylko metody #get(). Może wiesz, jak mogę wdrożyć taką funkcjonalność za pomocą ehcache? – MeetJoeBlack

4

nie będę pisać ci przykładowy kod, ponieważ stałoby się zbyt długo, ale to jest jak ja to robiłem:

  1. Extend LinkedBlockingQueue.
  2. Zastąpić metody , , ,i remove. Przykład: jeśli nadklasa 'offer zwraca wartość false (osiągnięta pojemność), następnie Zacznę od serializacji na dysk.
  3. Podobnie w implementacji sprawdzasz, czy w ogóle masz jakiekolwiek elementy obecne w pamięci, a jeśli nie, , a następnie rozpoczynasz odczytywanie z dysku (i usuwanie pierwszego przeczytanego rekordu, ponieważ będzie on teraz znajdował się w pamięci; lub oczywiście możesz czytać zapisy w partiach).
  4. Przypisanie każdej instancji takiej kolejki identyfikatora bezpiecznego systemu plików, aby można go było użyć do utworzenia bezpiecznej dla niego nazwy pliku. Ponadto, aby to zrobić dalej, prawdopodobnie użyłbym katalogu domowego bieżącego użytkownika jako miejsca, w którym te kolejki mają zostać przekształcone do postaci szeregowej na dysku.

W ten sposób 99% kolejki serializowanej dyskiem jest już gotowe, a dodatkowe funkcje można umieścić tylko w odpowiednich miejscach. Musisz dokładnie przeczytać dokumentację interfejsu Javy BlockingQueue, ale hej, warto poświęcić swój czas, ponieważ dodasz tylko trochę dodatkowej funkcjonalności, jakiej potrzebujesz, zamiast pisać całą rzecz od zera.

Mam nadzieję, że to pomoże.

Powiązane problemy