Java Map vs Backend数据库。对于速度和关系的多线程哪个更好?

时间:2014-01-08 09:11:55

标签: java database multithreading map time-complexity

我的算法可能不会在网络上使用。但是,我描述的对象可能被多个线程使用。

我设计的原始对象模拟指针。

减少,符号将映射到多个指针,每个唯一指针将映射到单个符号。

当我最终完成并且有一个工作算法时,事实证明我实际上总共需要六个地图(这些地图被称为数万次)。

使用非常小的符号样本集进行的初始测试表明该程序非常有效。但是,我担心一旦我将符号数增加了几千倍就会变得迟钝。

程序完成并关闭后,指针不需要持久化。

我想知道是否应该使用数据库作为后端来实现我的算法。这会比使用所有这些地图更好吗?

地图存储在内存中。数据库将存储在硬盘驱动器上(我有一个SSD,所以我担心我的机器与使用SATA / PATA的机器的性能会有很大差异)。地图也应该是O(1)。一旦引入多线程,映射也可能变得非常难看,除非我使用线程安全映射,这会降低程序的速度。数据库将有效地处理这些任务。

我已经正式写出了正确的关系,我确信如果这是最好的选择,我可以在数据库中实现它。哪个更好?

3 个答案:

答案 0 :(得分:0)

硬盘驱动器,即使速度很快,也比内存慢几个数量级。因此,如果你的目标是表现,你应该留在记忆中并使用地图。对于线程安全,您可以使用ConcurrentHashMap,它使用无锁算法,并且多线程环境中的同步代价应该是最小的。

您还应检查单个线程是否提供足够的性能 - 多个线程总是会引入一些开销,并且需要带来足够的增益来抵消它。

您可能还想检查内存中的数据库,例如HyperSQLH2 Database

答案 1 :(得分:0)

如果您不需要保留该数据结构,请不要尝试在数据库上支持它。在您的位置,我会尝试使用您已有的数据结构上的适当数据进行一些负载测试,并尝试从那里优化它,如果性能不是我所期望的。

无论如何,目前的趋势是在硬盘中使用关系数据库进行持久化,并在内存中的“大哈希表”中缓存频繁查询的数据以提高性能,我怀疑回到数据库会提高性能

答案 2 :(得分:0)

如果您的数据结构适合内存,如果使用数据库会更快(甚至不考虑使用数据库实现的复杂性),我会感到震惊。通过丢弃数据库必须维护的所有假设,功能,安全性和一致性,您将获得性能。即使是最好的数据库实现,假设有足够的内存来缓存所有内容,几乎都有ConcurrentHashMap作为性能的上限。实际上,即使有很好的缓存,也不会获得CHM性能,因为DB API将需要防御性副本或缓存失效,您可以通过内存结构避免这些失效。

除了使用内存中的hashmap可能提升性能之外,您还可以通过根据特定用例调整结构来获得额外的性能。例如,初始查找可能是多线程的,但单个值只能由单个线程访问。在这种情况下,您可以避免锁定这些值。