【问题标题】:Inserting to and searching a large amount of data in Java在 Java 中插入和搜索大量数据
【发布时间】:2012-08-06 04:26:23
【问题描述】:

我正在用 Java 编写一个跟踪棒球卡数据的程序。我正在尝试决定如何持久存储数据。我一直倾向于将数据存储在 XML 文件中,但我不熟悉 XML API。 (我已经阅读了一些在线教程并开始尝试使用 javax.xml 层次结构中的类。)

该软件具有主要用例:用户将能够添加卡片和搜索卡片。

当用户添加卡片时,我想立即将数据提交到持久存储。标准 API 是否允许我以随机访问的方式插入数据(甚至追加也可以)。

当用户搜索卡片时(例如,通过玩家的名字),我想从存储中加载一个列表,而不必加载整个文件。

我最担心的是我需要存储大量独特卡片的数据(大约数千张,可能更多)。我不想在程序打开时将所有卡的列表存储在内存中。我没有运行任何测试,但我相信我很容易遇到内存限制。

XML 可能不是最好的解决方案。但是,我想让它尽可能简单地安装,所以我尽量避免使用 JDBC 或任何第三方库的成熟数据库。

所以我想我是在问我是否朝着正确的方向前进,如果是这样,我在哪里可以了解更多关于以我想要的方式使用 XML 的信息。如果没有,是否有人对我可以使用哪些其他类型的存储来完成此任务提出建议?

【问题讨论】:

    标签: java xml


    【解决方案1】:

    虽然我当然不会反对使用 XML,但它在您的上下文中确实有一些缺点。

    “标准 API 是否允许我以随机访问的方式插入数据”

    是的,在内存中。不过,您必须将整个模型保存回文件。

    “当用户搜索卡片时(例如,通过玩家的名字),我想从存储中加载一个列表,而不必加载整个文件”

    除非您希望多个用户读取/写入文件,否则我可能会在加载时将整个文件/模型拉入内存并保留在那里直到您想要保存(定期写入背景仍然是好主意)

    我不想在程序打开时将所有卡片的列表存储在内存中。我没有运行任何测试,但我相信我可以轻松地达到内存限制

    这将是我关心的。但是,您可以使用 SAX 解析器将文件读入自定义模型。这将减少内存开销(因为 DOM 解析器可能有点贪婪)

    “但是,我想让它的安装尽可能简单,所以我尽量避免使用 JDBC 来构建成熟的数据库”

    我会在这方面做更多的研究。我(个人)经常使用H2HSQLDB 来存储大量数据。这些是小型的个人数据库系统,不需要任何额外的安装(链接到程序的 Jar 文件)或特殊的服务器/服务。

    它们使您可以非常轻松地跨数据存储构建复杂的搜索,否则您需要自己创建。

    如果您要使用 XML,我可能会做以下三件事之一

    1 - 如果您要在内存中维护 XML 文档,我会熟悉 XPath (simple tutorial & Java's API) 进行搜索。

    2 - 我将使用对象创建数据的“模型”来表示各种节点,并使用 SAX 读取它。写作可能有点棘手。

    3 - 使用简单的 SQL 数据库(和对象模型) - 它将简单地处理整个过程(恕我直言)

    附加

    好像我对你的倾诉还不够;)

    如果你真的想要 XML(同样,我不会阻止你),你可以考虑看看 XML 数据库风格的解决方案

    Apache Xindice(显然已退休)

    或者你可以看看其他人的想法

    例如;)

    【讨论】:

    • 我可能应该提到我有一个 BaseballCard 类,它具有用于单个卡的所有数据(Strings 和 ints)的 getter 和 setter。我计划将其用作我的模型,以在我的 Swing GUI 中显示搜索结果。我不打算将完整的 XML 文档存储在内存中,甚至希望避免存储所有 BaseballCard 对象的列表,如果可能的话。
    • 正如你所说,写作部分是我遇到问题的地方。这就是我想开始的地方,以便我可以搜索数据。也许我应该手动创建一些模拟数据,然后先做阅读部分,因为这听起来更容易一些……假设我坚持 XML 的想法。
    • 感谢 SQL 建议。将 JAR 文件添加到我的发行版中可能是可行的,但我当然不想做更多的事情。 (我为所有单独的 cmets 道歉。我主要是在大声思考......并在我这样做的时候试图表达一些感激之情。)
    • 最后一条评论:您为什么建议使用 SAX 而不是 StAX 或其他 API?
    • @Code-Guru 保存时您将面临的问题(如我所见)是(根据我的经验)您需要内存中的 XML 来更新它,然后才能保存它。我不喜欢任何特定的 API(我很懒,我倾向于使用内置的 API :P)。我建议使用 SAX 样式解析器,因为它没有 DOM 样式解析器的内存开销,仅此而已。我认为您通常会发现设计良好的 SQL 实现将更好地满足您的需求,因为您可以获得 XML 无法获得的随机读/写访问权限 - 恕我直言
    猜你喜欢
    • 2019-06-25
    • 2012-01-05
    • 2021-11-11
    • 2015-11-27
    • 2013-10-23
    • 2014-03-03
    • 2021-05-19
    • 2014-02-01
    • 2011-06-28
    相关资源
    最近更新 更多