gpt4 book ai didi

java - 如何在java中使用大型数据库表而不会遇到性能问题

转载 作者:行者123 更新时间:2023-12-02 01:59:51 25 4
gpt4 key购买 nike

我们有一个词汇表,用于搜索文本文档。使用该表的 java 程序当前从数据库中读取它,将其存储在内存中,然后在文档中搜索表中的各个项目。出于性能原因将该表放入内存中。这已经工作了很多年,但随着时间的推移,表变得相当大,现在我们开始看到 Java 堆空间错误。

有一个强力方法可以解决这个问题,即升级到更大的服务器,安装更多内存,然后为 Java 堆分配更多内存。但我想知道是否有更好的解决方案。我认为嵌入式数据库无法满足我们的目的,因为表不断更新,并且应用程序托管在多个站点上,这意味着维护噩梦。但是,我不确定还有哪些其他技术可以在这种情况下有所帮助。

更多细节,目前有超过一百万个词汇项(将这些项视为短文本字符串,而不是单个单词)。我们的应用程序从目录中读取文档,然后分析每个文档以确定文档中是否存在任何词汇表。如果是,我们会记录存在哪些项目并将它们存储在数据库中。词汇表本身存储并维护在我们多年来不断发展的 MS SQL 关系数据库中。由于必须对每个文档的所有词汇项进行分析,因此从数据库中重复读取的效率很低。在我们的某些安装中,每天需要分析的文档数量可能相当大(每天大约 100K 个文档)。这些文档通常有 2 到 3 页长,尽管我们偶尔会看到长达 100 页的文档。

最佳答案

为了提高应用程序的性能,您从数据库中取出所有数据,并将其放入设计时考虑到高效数据操作的数据库中。到您的应用程序的内存中。这对于小型数据集来说效果很好,但随着这些数据集的增长,您最终将耗尽应用程序中处理整个数据集的资源。

解决方案是使用适合您的用例的数据库,或至少是数据层。让您的数据层承担繁重的工作,而不是将数据集复制到您的应用程序中。数据库是令人难以置信的,它们处理大量数据的能力常常被低估。您并不总能免费获得极快的性能(您可能必须认真考虑索引和模型),但很少有 Java 代码能够提取整个数据集并更有效地处理它的用例比数据库可以。

您没有过多说明您正在使用哪些数据库技术,但大多数关系数据库都会提供许多有用的全文搜索工具。我见过设计良好的关系数据库非常有效地执行文本搜索。但是,如果您受到数据库技术的限制,或者您的表确实太大,以至于关系数据库文本搜索不可行,那么您应该将数据放入可搜索的缓存中,例如 Elasticsearch 。如果您有效地对数据进行建模和索引,您就可以构建一个性能非常高且 cocoa 靠扩展的文本搜索平台。 Tom 对 lucene 的建议是另一个很好的建议。有很多云技术也可以帮助解决此类问题:如果您喜欢 AWS,您会想到 S3 + Athena。

关于java - 如何在java中使用大型数据库表而不会遇到性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770763/

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