Какую коллекцию Java использовать в этом случае? - PullRequest
7 голосов
/ 31 января 2011

Мне нужно хранить большое количество элементов (500k или около того) в списке или наборе, которые мне нужны для высокопроизводительного обхода, сложения и удаления. Это будет сделано в многопоточной среде, и мне все равно, смогу ли я увидеть обновления, сделанные после того, как начался обход (слабосогласованный), какая коллекция Java подходит для этого сценария?

Ответы [ 8 ]

3 голосов
/ 31 января 2011

Мне нужно провести большое количество элементы (500k или около того) в списке или установить мне нужно сделать высокую производительность обход, добавление и удаление. ... Это будет сделано в многопоточном окружающая среда


ConcrrentSkipListMap - это не список, но семантика списка практически бесполезна в параллельной среде. Он будет иметь элементы, отсортированные в древовидной структуре и недоступные для хеширования, поэтому вам нужно некоторое естественное упорядочение (или внешнее через компаратор)

Если вам нужно только добавить / удалить в конце очереди - ConcurrentLinkedQueue .

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

В конце: если вы собираетесь использовать настоящий многопроцессорный процессор, например 64+, ожидаете высокой конкуренции и не хотите естественного упорядочения, перейдите по ссылке: http://sourceforge.net/projects/high-scale-lib

2 голосов
/ 31 января 2011

Вот очень хорошая статья о выборе коллекции в зависимости от вашего приложения

http://www.developer.com/java/article.php/3829891/Selecting-the-Best-Java-Collection-Class-for-Your-Application.htm

Вы также можете попробовать это

http://www.javamex.com/tutorials/collections/how_to_choose.shtml

1 голос
/ 31 января 2011

Если вы часто добавляете и удаляете файлы, то, вероятно, лучшим выбором будет что-то «связанное». Таким образом, каждый раз, когда вы добавляете / удаляете, должен обновляться только индекс, в отличие от ArrayList, например, где весь массив должен быть «перемещен». Проблема в том, что вы просите святой Грааль Коллекций.

Взглянув на , параллельные коллекции могут помочь.

Но что вы подразумеваете под "обходом"?

1 голос
/ 31 января 2011

Многопоточный - так что смотрите на юконкуррент.Может быть, ConcurrentHashMap используется как Set - например, используйте put (x, x) вместо add (x).

1 голос
/ 31 января 2011

Если обойти == прочитать и добавить / удалить == обновить, я бы сказал, что не часто оптимизируется одна коллекция для обеих операций.

Но вашей лучшей ставкой, вероятно, будет HashMap .

0 голосов
/ 31 января 2011

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

0 голосов
/ 31 января 2011

Если вам нужно быстро добавить или удалить элементы в середине списка, LinkedList - хороший выбор.Чтобы использовать его в многопоточной среде, необходимо синхронизировать его следующим образом:

List l = Collections.synchronisedList(new LinkedList());
0 голосов
/ 31 января 2011

разрешены ли дубликаты?

- да, набор не может быть использован.в противном случае вы можете использовать SortedSet.

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