Использование одновременной хэш-карты для уменьшения использования памяти с помощью пула потоков? - PullRequest
3 голосов
/ 31 августа 2011

Я работаю с программой, которая выполняет длинные SQL-запросы и сохраняет обработанные результаты в HashMap. В настоящее время, чтобы обойти медленное время выполнения каждого из 20-200 запросов, я использую фиксированный пул потоков и пользовательский вызов для выполнения поиска. В результате каждый вызываемый объект создает локальную копию данных, которую затем возвращает в основную программу для включения в отчет.

Я заметил, что 100 отчетов о запросах, которые раньше выполнялись без проблем, теперь приводят к нехватке памяти. Мое предположение состоит в том, что, поскольку эти вызываемые объекты создают свою собственную копию данных, я удваиваю использование памяти, когда присоединяю их к другой большой HashMap. Я понимаю, что мог бы попытаться уговорить сборщик мусора, чтобы попытаться уменьшить область действия таблицы вызова, но этот уровень реструктуризации не совсем то, что я хочу сделать, если можно избежать.

Могу ли я улучшить использование памяти, заменив вызываемые элементы на исполняемые, которые вместо хранения данных записывают их в параллельный HashMap? Или это звучит так, как будто у меня есть другая проблема?

Ответы [ 3 ]

3 голосов
/ 31 августа 2011

Не создавайте копию данных, просто передавайте ссылки, обеспечивая при необходимости безопасность потоков. Если без копирования данных у вас все еще есть OOM, рассмотрите возможность увеличения максимально доступной кучи для приложения.

Недостаток вышеупомянутого подхода, не использующего копирование данных, заключается в том, что, тем не менее, труднее обеспечить безопасность потоков.

1 голос
/ 31 августа 2011

Вам действительно нужны все 100-200 отчетов одновременно?

Может быть, стоит ограничить 1-й уровень кэширования всего лишь 50 отчетами и ввести 2-й уровень на основе WeakHashMap ?Когда 1-й уровень превышает его размер, LRU будет перемещен на 2-й уровень, который будет зависеть от объема доступной памяти (с использованием WeakHashMap ).

Затем для поиска отчетов вы сначаланеобходимо запросить 1-й уровень, если значение отсутствует, запросить 2-й уровень, а если значение не существует, то отчет был восстановлен GC, когда было недостаточно памяти, и вам необходимо запросить БД для этого отчета.

0 голосов
/ 31 августа 2011

Зависят ли результаты запросов от других результатов запроса?Если нет, всякий раз, когда вы обнаруживаете результаты в другом потоке, просто используйте ConcurrentHashMap, как вы намекаете.Вы действительно должны спросить, не вызывает ли ваша программа нехватки памяти при создании нескольких ненужных копий данных?Это должно быть почти очевидно.

...