2014-09-14 3 views
2

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

Например:

public interface CarDetails { 
    public CopyOnWriteArrayList<Car> getAllCars(); 
    public Car getMostSoldCars(int carModel); 
    public void addNewCarDetails(Car car); 
    public void oldCardDetails(Car car); 
}  

Первоначально я думал использовать Параллельное API, (CopyOnWriteArrayList), как его выполняет лучше по сравнению с внешней синхронизации списка (например: Collections.synchronizedList (список объектов)) ,

Проблема с CopyOnWriteArrayList: Чтобы хранить миллионы объектов в памяти и выполнения frequest операций на нем имеет влияние на производительность, потому что CopyOnWriteArrayList полностью создает новый список каждый раз, когда какой-либо Updation происходит на нем и выполнять такие операции прозводятся на миллионах объектов имеет проблемы с производительностью. Это полезно для нескольких читателей, но я ищу работу на большом количестве объектов.

Проблема с Collections.synchronizedList (объект списка): Внешняя синхронизация списка имеет другую проблему, поскольку она блокирует весь объект, который имеет другую проблему с производительностью.

Может ли кто-нибудь мне предложить, какие API-интерфейсы коллекции подходят для этого типа требований (параллелизм, масштабируемость, миллионы объектов, более высокая производительность при частой работе).

Заранее благодарен!

+2

Вам, скорее всего, не нужно ничего лучше, чем обертка 'synchronizedList'. Вы действительно протестировали производительность этого решения? Кроме того, выбор абсолютно оптимальной структуры включает в себя гораздо больше деталей, чем вы предоставили, например: частота обновлений, отношение чтения к записи, фактический уровень параллелизма и т. Д. –

+0

Порекомендуйте посмотреть 'concurrentHashMap' (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html)' ' – Hungry

+2

test, ** test **, ** КОНТРОЛЬНАЯ РАБОТА**. Попробуйте все подходы и ** тест **. Как говорит @MarkoTopolnik, начните с самого простого решения и поэтапно улучшите - проверяя каждое «улучшение» с помощью тестов. Если 'synchronizedList' недостаточно хорош, напишите класс, который' реализует List' и завершает 'ArrayList' с помощью' ReentrantReadWriteLock'. –

ответ

0

ConcurrentLinkedQueue является ждать свободной (т.е. безблокировочного и потоки не будут голодать) и не выполняет копирование

Если вы хотите сохранить набор вместо списка, то вы можете иметь несколько потоков добавлять объекты в ConcurrentLinkedQueue и имеют одну нитку опрос очереди и добавить объекты в несинхронизированном HashMap; это может быть более эффективным, чем использование ConcurrentHashMap. Однако это предполагает, что вы можете выдержать небольшую задержку между добавляемым объектом и объектом, отображаемым в наборе.

0

Я думаю, что лучшая привязка данных для прапраменности была бы hashMap, она имеет операцию поиска O (1), а arrayList принимает O (N).

На стороне параллелизмом, я бы probly пойти с

ConcurrentSkipListMap

Или

ConcurrentHashMap

В зависимости от ваших потребностей.

Я иду в подробности о разнице между этими двумя здесь: Thread safe way to copy a map

+0

«Список» - это не 'Set'. В то время как 'Set' имеет' O (1) 'search, он также поддерживает уникальные объекты, которые делают _cost_. –

+0

Ключи находятся в наборе, и он не поддерживает его, его же, как и поиск, он переопределяет, если он существует, он не проверяет. –

+0

И как он знает, что он переопределяет, если существует, без каких-либо проверок? Хеширование и проверка требуют времени. –

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