gpt4 book ai didi

java - 用于存储记录的数据库/缓存的纯 Java 替代方案

转载 作者:行者123 更新时间:2023-12-01 14:27:16 25 4
gpt4 key购买 nike

我创建了一个销售给客户的应用程序,其中一些是具有固定限制(慢 CPU)的硬件制造商。该应用程序必须使用 Java 语言,以便可以将其作为单个包轻松安装。

该应用程序是多线程的并维护音频记录。在这种特殊情况下,我们所拥有的只是 INSERT SOMEDATA FOR RECORD,每条记录代表一个音频文件(这可以由不同的线程完成),然后我们在 (x, y, z) 中选择 SOMEDATA WHERE IDS单线程,然后第三步是我们实际上删除了这个表中的所有数据。

主要约束是cpu,单cpu慢。内存也是一个限制,但只是因为应用程序的设计使其可以处理无限数量的文件,所以即使有很多内存,如果全部存储在内存中而不是利用磁盘,最终也会用完。

在我的 Java 应用程序中,我开始使用 H2 数据库来存储我的所有数据。但是该软件必须在一些速度较慢的单 CPU 服务器上运行,因此我想减少使用的 CPU 周期,我想再次关注的一个领域是数据库。

在许多情况下,我将数据插入数据库只是为了将数据保存在堆之外,否则会耗尽内存,然后稍后我们检索数据,我们永远不必更新数据。

所以我考虑使用像 ehCache 这样的缓存,但是有两个问题:

  • 不保证数据不会被丢弃(如果缓存已满)
  • 我一次只能检索一条记录,而使用关系数据库我可以检索一批记录,这看起来像是一个潜在的瓶颈。

解决这些问题的替代方案是什么?

最佳答案

您希望快速批量检索记录,不丢失任何数据,但您不需要优化查询或更新,并且您希望尽可能有效地使用 CPU 和内存资源:

为什么不直接将记录存储在文件中?操作系统使用所有空闲内存进行缓存。因此,当您频繁访问文件时,操作系统会尽最大努力在内存中保留尽可能多的内容。无论如何,操作系统都会完成这项工作,因此这种类型的缓存不需要额外的 CPU,也不需要一行代码。

在优化方面投入更多资金唯一有意义的场景是:

  • a) 您的进程或其他进程大量使用文件系统,并且污染文件缓存
  • b) 序列化/反序列化太昂贵

如果是 a):

确定您的优先事项。显式缓存(在堆中或堆外)可以帮助您将选定文件的某些内容保留在内存中。但是这个内存将不再适用于操作系统的文件缓存。因此,当您加快一个文件的访问速度时,您可能会减慢对其他文件的访问速度。

对于 b):

在优化任何内容之前,先衡量性能。通常磁盘访问是瓶颈——如果不更换硬件就无法改变这一点。如果您仍然想优化(例如,因为 GC 由于大量临时创建的对象而占用 CPU - 我猜只有一个核心串行 GC 将被使用)那么我建议仔细查看 Google flatbuffers .

您从最复杂的问题解决方案开始,即数据库。我建议从另一端着手,尽可能简单


更新:同时对问题进行了编辑,要求也发生了变化。现在的新要求是必须能够通过 ID 读取选定的记录。

可能的扩展:

  • 将每条记录存储在自己的文件中,并使用 key 作为文件名
  • 将所有记录存储在一个文件中并使用基于文件的 HashMap 实现喜欢MapDB's HTreeMap实现。

独立于所选扩展名,操作系统的文件缓存将尽最大努力在主内存中保存尽可能多的内容。

关于java - 用于存储记录的数据库/缓存的纯 Java 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61906741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com