我的算法可能不会在网络上使用。但是,我描述的对象可能被多个线程使用。
我设计的原始对象模拟指针。
减少,符号将映射到多个指针,每个唯一指针将映射到单个符号。
当我最终完成并且有一个工作算法时,事实证明我实际上总共需要六个地图(这些地图被称为数万次)。
使用非常小的符号样本集进行的初始测试表明该程序非常有效。但是,我担心一旦我将符号数增加了几千倍就会变得迟钝。
程序完成并关闭后,指针不需要持久化。
我想知道是否应该使用数据库作为后端来实现我的算法。这会比使用所有这些地图更好吗?
地图存储在内存中。数据库将存储在硬盘驱动器上(我有一个SSD,所以我担心我的机器与使用SATA / PATA的机器的性能会有很大差异)。地图也应该是O(1)。一旦引入多线程,映射也可能变得非常难看,除非我使用线程安全映射,这会降低程序的速度。数据库将有效地处理这些任务。
我已经正式写出了正确的关系,我确信如果这是最好的选择,我可以在数据库中实现它。哪个更好?
答案 0 :(得分:0)
硬盘驱动器,即使速度很快,也比内存慢几个数量级。因此,如果你的目标是表现,你应该留在记忆中并使用地图。对于线程安全,您可以使用ConcurrentHashMap,它使用无锁算法,并且多线程环境中的同步代价应该是最小的。
您还应检查单个线程是否提供足够的性能 - 多个线程总是会引入一些开销,并且需要带来足够的增益来抵消它。
您可能还想检查内存中的数据库,例如HyperSQL
或H2 Database
。
答案 1 :(得分:0)
如果您不需要保留该数据结构,请不要尝试在数据库上支持它。在您的位置,我会尝试使用您已有的数据结构上的适当数据进行一些负载测试,并尝试从那里优化它,如果性能不是我所期望的。
无论如何,目前的趋势是在硬盘中使用关系数据库进行持久化,并在内存中的“大哈希表”中缓存频繁查询的数据以提高性能,我怀疑回到数据库会提高性能
答案 2 :(得分:0)
如果您的数据结构适合内存,如果使用数据库会更快(甚至不考虑使用数据库实现的复杂性),我会感到震惊。通过丢弃数据库必须维护的所有假设,功能,安全性和一致性,您将获得性能。即使是最好的数据库实现,假设有足够的内存来缓存所有内容,几乎都有ConcurrentHashMap
作为性能的上限。实际上,即使有很好的缓存,也不会获得CHM性能,因为DB API将需要防御性副本或缓存失效,您可以通过内存结构避免这些失效。
除了使用内存中的hashmap可能提升性能之外,您还可以通过根据特定用例调整结构来获得额外的性能。例如,初始查找可能是多线程的,但单个值只能由单个线程访问。在这种情况下,您可以避免锁定这些值。