основанный на java диск hashmap - PullRequest
4 голосов
/ 23 июля 2010

Я работаю над веб-сканером (пожалуйста, не предлагайте существующий, это не вариант).У меня все работает так, как ожидается.Моя единственная проблема заключается в том, что в настоящее время я использую своего рода модель сервера / клиента, где сервер выполняет сканирование и обработку данных, а затем помещает их в центральное расположение.

Это расположение является объектом созданияиз класса, который я написал.Внутренне класс поддерживает хэш-карту, определенную как HashMap<String, HashMap<String, String>>

. Я храню данные на карте, делая URL-адрес ключом (я сохраняю их уникальность), а значение hasmap хранит соответствующие поля данных для этого URL-адреса, такие как заголовок,значение и т. д.

Время от времени я сериализую используемые внутренние объекты, но паук многопоточный, и, как только я скажу, что 5 потоков, сканирующих память, возрастают в геометрической прогрессии.

До сих пор производительностьотлично справился с хэш-картой, сканируя 15K URL за 2.r минуты и занимая около 30 секунд процессорного времени, поэтому мне действительно не нужно указывать в направлении существующего паука, как предлагали большинство пользователей форума.

Кто-нибудь может предложить быстрое решение на основе диска, которое, вероятно, будет поддерживать одновременное чтение и запись?Структура данных не должна быть одинаковой, просто должна быть возможность хранить связанные значения метатегов вместе и т. Д.

заранее спасибо

Ответы [ 5 ]

3 голосов
/ 23 июля 2010

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

В качестве альтернативы, вы могли бы рассмотреть правильную встроенную базу данных, такую ​​как Hypersonic (или множество других подобных стилей), но это, вероятно, будет больше работы.

1 голос
/ 23 февраля 2012

Библиотека JDBM2 предоставляет постоянные карты для Java. Это быстро и потокобезопасно.

UPDATE : Эволюционировал в MapDB проект

1 голос
/ 23 июля 2010

Существует Tokyo Cabinet , который представляет собой быструю реализацию дисковой хеш-таблицы.

В вашем случае, я думаю, лучший способ сохранить значения в такой настройкебыть префиксом ключей метаданных с помощью URL:

[url]_[name] => [value]
[url]_[name2] => [value2]

К сожалению, я не уверен, что вы можете перечислить метаданные для данного URL, используя это решение.используйте более структурированное хранилище данных, есть также MongoDB и SQLite, которые я бы порекомендовал.

0 голосов
/ 08 июля 2016

Хроническая карта - это встраиваемое хранилище данных Java на основе хеш-функции, сохраняющее данные на диск (в один файл), которое предназначено для замены ConcurrentHashMap (обеспечивает тот же ConcurrentMap интерфейс). Chronicle Map является самым быстрым магазином среди аналогичных решений и обладает превосходным параллелизмом чтения / записи, масштабируясь почти линейно с количеством доступных ядер в машине.

Отказ от ответственности: я разработчик Chronicle Map.

0 голосов
/ 23 июля 2010

как насчет использования JPA в вашем классе и сохранения данных в базе данных (которая может быть основана на тексте, например, sqlite) http://en.wikipedia.org/wiki/Java_Persistence_API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...