2015-08-07 3 views
0

У меня есть ниже сценарий:Проблема памяти: Хранение данных больших объемов в карте

  1. Огромного список сообщений из внешней системы (Сообщение содержит идентификатор и полезную нагрузку)
  2. Я фильтрацию этих сообщений на основе на идентификаторе и хранения полезной нагрузки в списке и, наконец, идентификатора и списка на карте.
  3. Позже, на основе идентификатора, я извлекаю список полезной нагрузки с карты и передаю весь список полезной нагрузки для дальнейшей обработки службе-исполнителю.

Ну, мне не нравится этот подход, поскольку во время выполнения у меня есть карта, содержащая все данные (пункт 2). Я мог бы решить проблему с памятью. Есть ли хорошо альтернатива вышеуказанного подхода.

EDIT

Я использую Java. Я получаю сообщения от какой-то внешней системы (я понятия не имею об объеме сообщений, которые могут возникнуть) и, наконец, обрабатываю их на основе их идентификатора. После обработки они сохраняются в базе данных. Однако проблема заключается в том, что я загружаю сообщения в Map на основе ID. Я должен сгруппировать сообщения на основе идентификатора, а затем отправить для обработки. Поэтому я должен хранить всю карту в памяти в течение определенного периода времени.

Заранее спасибо.

+3

Сохранение сообщений в базе данных? (выберите ваш яд: реляционный или noSQL) ... Или покупаете дорогостоящий продукт (например, большую память Terracotta) и много оперативной памяти (сейчас 1TB дешево :) – Augusto

+1

Насколько велики данные? Рассматриваете ли вы использование кеширующих инструментов, таких как hazelcast или cassandra. – dogant

ответ

2

Я помню, как использовал себя MapDB. В основном это дает вам интерфейс карты, но подкрепляется off-heap memory (думаю, что файлы с отображением памяти в Linux).

Вы можете найти пример здесь: https://github.com/jankotek/mapdb/blob/master/src/test/java/examples/CacheOffHeap.java

скопирует соответствующие части здесь для облегчения ведения:

 final double cacheSizeInGB = 1.0; 

     // Create cache backed by off-heap store 
     // In this case store will use ByteBuffers backed by byte[]. 
     HTreeMap cache = DBMaker 
       .memoryDirectDB() 
       .transactionDisable() 
       .make() 
       .hashMapCreate("test") 
       .expireStoreSize(cacheSizeInGB) //TODO not sure this actually works 
       .make(); 

     //generates random key and values 
     Random r = new Random(); 
     //used to print store statistics 
     Store store = Store.forEngine(cache.getEngine()); 


     // insert some stuff in cycle 
     for(long counter=1; counter<1e8; counter++){ 
      long key = r.nextLong(); 
      byte[] value = new byte[1000]; 
      r.nextBytes(value); 

      cache.put(key,value); 

      if(counter%1e5==0){ 
       System.out.printf("Map size: %,d, counter %,d, store size: %,d, store free size: %,d\n", 
         cache.sizeLong(), counter, store.getCurrSize(), store.getFreeSize()); 
      } 

     } 

     // and release memory. Only necessary with `DBMaker.memoryDirect()` 
     cache.close(); 
+0

MapDB..sounds good. Я дам ему попробовать. – atom

Смежные вопросы