【问题标题】:Need to store LOTS of data on Android device, thinking of going OODB需要在 Android 设备上存储大量数据,考虑使用 OODB
【发布时间】:2011-05-18 06:08:42
【问题描述】:

我目前正在开发一个基于 Android 的项目。在不涉及许多细节的情况下,该软件将在定制的设备上运行。硬件永远不会改变,永远都是一样的。这绝对是一个加分项:)

话虽如此,该项目要求我们在设备上存储负载和数据负载 - 在某些表中超过 3m 行。 SQLite 对我们来说很好地处理了这么多行的扫描,当我们开始进行复杂的连接以带回我们需要的所有相关数据时,问题就出现了。我们已经考虑过对数据库进行非规范化,但担心这会将数据库推到可用范围之外。

我们正在研究使用面向对象的数据库,例如 db4o 或 NeoDatis。我们希望通过存储对象,我们可以摆脱行级别的关系并将它们存储在对象上(就像 OOP 一样)。问题是我们无法找到这些 ODB 在 Android 上运行和使用的任何与性能相关的基准(至少不是最近的)。

是否有人对 Android 上的 OODB 和/或存储和访问如此大量的数据有任何经验?如果是这样,您可以提供任何建议将不胜感激。

-- 编辑

这是我们面临的问题的一个示例。它与我们的应用程序无关(我的 NDA 说我不能发布任何具体内容)但这个例子很好地代表了这个问题。

假设我们正在构建一个应用程序来监控在任何给定时间在新泽西收费公路上行驶的每辆车。对于任何给定的汽车,我们需要跟踪汽车的品牌和型号、车内有多少人以及车内人员的人口统计数据。所以基本上你最终得到的数据看起来像 -

汽车

标识 | 颜色 | make_id | in_toll_lane | model_id

制作

标识 | 名字

型号

标识 | 姓名 | make_id

汽车人

标识 | 年龄 | 性别 | is_driver | car_id

收费车道

标识 | car_in_line | 理想的汽车线 | 理想的住户

这些数据会经常变化。它也将变得相当庞大,因为毫无疑问,在任何特定时间都有很多人沿着 NJ Pike 行驶。

有了这些数据,我们需要能够根据需要对任何在长矛上行驶的人进行快照。我们还需要能够拍摄所有正在开车的男性或收费公路上的所有女性的快照。我们还需要能够按年龄、性别、品牌、型号等进行搜索。

现在想象一下,我们需要根据车内人数、理想乘员人数、已经排队的汽车数量以及应该进入的理想汽车数量来计算每辆汽车应该进入哪个收费车道排队。

这是一个非常简单的例子,虽然很能代表我们的问题。

-- 结束编辑

提前致谢!

【问题讨论】:

  • 听起来是一个非常有趣的项目!这并不能直接解决您的问题,但您可能想在选择使用 db4o 许可之前好好看看它:db4o.com/about/productinformation/whitepapers/#gpl
  • 感谢您的评论!这是定义。一个有趣的项目 :) 我已经看到了他们的许可模式,如果需要,我们已经准备好为解决方案付费。因为我希望避免 BerkelyDB 的建议,所以我把它从我的原始帖子中删除了。 (个人喜好,真的)=)
  • 好吧,如果 BDB 是可能的,那么 SQLite 肯定是。您可以将它用作简单的键/对象存储,并且一些用户发誓它在该领域大大优于 BDB,特别是对于大型数据集。 (免责声明:我没有亲自尝试过)
  • 哈维尔的观点很好,我们正在测试中。虽然我们没有真正的键/值,我们正在添加一些其他元数据列,以使我们更容易获得我们需要的东西。不过,我们确实预见到了一些问题。在 SQLite 方法中,我们如何搜索对象中的属性?我们的解决方案(我们正在测试,所以不是真正的解决方案)是将这些字段添加为元数据列。还有交联问题。我们可以找到一个项目有哪些类别(它在对象上),但是我们如何找到哪些项目是一个类别的一部分?

标签: android sqlite object-oriented-database oodb


【解决方案1】:

Jason:要联系任何 db4o 成员,您必须使用此模式:firstname @ db4o.com 最好的!

【讨论】:

    【解决方案2】:

    代表 db4o:我们在 Android 上运行所有回归测试,因为我们认为它将成为 db4o 的一个非常重要的平台。

    db4o 非常适合 300 万个对象。

    我们正在http://www.polepos.org/ 上针对其他数据库进行基准测试,我们将很快发布新版本的基准测试,我们将在其中运行复杂的设置,也针对 SqlLite。将基准测试移植到 Android 也是一个考虑因素。

    如果连接影响了您的性能并且您拥有非常异构的数据,那么 db4o 可能比关系数据库更好。

    您的应用听起来很有趣。如果您在评估 db4o 时需要帮助,请给我留言。

    【讨论】:

    • 感谢您的回复,卡尔!我现在正在研究评估 db4o。我现在的问题是我有很多关于 OODB 的问题,因为我以前从未使用过它们。我很感激提供帮助!我试图在 StackOverflow 上向您发送消息,但显然我不能? =)
    • 我们正在监控 stackoverflow 上的 db4o 标签,因此您可以在此处或在我们的论坛中提问:developer.db4o.com/Forums.aspx。我的电子邮件: db4o dot com 的 carl
    【解决方案3】:

    这里有一些观察,但我怀疑它不会直接帮助你。

    我认为主要问题是:您是要在事件生成或更改数据时通过应用程序运行时逻辑发现复杂的关系,还是只需要将数据转储到存储中,然后通过查询发现未预料到的关系?

    如果您的业务逻辑将填充模型,那么您可以轻松地为数据模型的不同切片创建基于模型的视图,例如了解所有有男/女司机的汽车的集合。在这种情况下,基本上,您的关系是半静态的,很少变化(而这些关系另一端的数据值可能变化很大)。如果是这种情况,那么为什么要尝试将数据存储在数据库技术中,这会迫使您不断地重新计算关系(JOIN)。这只是对 CPU 的浪费,这就是为什么随着模型变得复杂,您会看到性能不佳的原因。所以,一旦你回答了这些问题,就很清楚ODB还是RDB是最佳选择了。

    现在问题变成了,什么将在 Android 上运行并处理大量数据?这是我认为我无能为力的地方。我在拥有(db4o 和 Versant)ODB 的 Versant 工作。现在 db4o 将在 Android 上运行,但它确实是处理海量数据的正确选择……不。除非您有非常孤立的数据,这些数据可以位于单独的数据库中并且只能单独访问,而且在我看来这听起来不像是您的情况。我们的另一个数据库 Versant 不能近乎实时地处理海量数据,但只有客户端是 100% Java,服务器是用 C 编写的,因此无法在 Android 上运行。

    我认为您需要做一些研究,看看谁拥有可以在 Android 上处理大量数据的 ODB。

    最好, -罗伯特

    【讨论】:

    • 非常感谢您提供的非常有见地的帖子。我们最初尝试实时发现连接,但是我们现在正在研究在数据更改后在后台编译这些复杂连接的结果。我们不需要立即准备好更改。更改和更新之间的几(
    • 嗨,Jason,是的,我认为在这种情况下 db4o 可以工作。我建议你接受卡尔的建议给他一个 ping。尝试 db4o 论坛来抓住他....developer.db4o.com/Forums.aspx 当涉及到对特定属性值的查询时,您将获得出色的性能和索引,并有一些很好的可用性选项,如本机查询,这将使您检查编译时间可重构的查询代码。祝项目好运。
    • 哦……还想指出来。我一定是错过了3M的条目评论,这是我扫描得到的。我认为“巨大”是指数以百万计和/或更多的数据,而不是轻松放入单个文件。像 3M 实例这样的东西对于 db4o 来说是没有问题的。
    • 理解并道歉 - 我在上下文中使用“巨大”来表示我们实际正在构建的内容。对于我们的设备将要存储的位置,3M 的数据记录很多 =)
    【解决方案4】:

    您并没有过多谈论您的数据访问需求或数据负载。

    如果您有 3M 主行,然后是一堆较小的叶表,那么您可以通过将所有叶表缓存在 RAM 中并手动“加入”它们来做得很好。许多系统都有非常小的叶表(特别是与主数据相比),因此将它们加载到 RAM 中,然后在加载行时简单地查找它们可能是一个巨大的胜利。

    显然,您不会对主要的父->子关系执行此操作,但是如果您可以消除叶子连接,那么读取将成为父子之间的单个连接,而不是父、子、和叶子表。

    即使这不适用于所有叶表,但如果它适用于大多数人,也可能足以让您克服困难。

    【讨论】:

    • 感谢您的回复!你提出了一个很好的观点,我并没有真正进入我们的数据需求。我们有很多关系,其中大部分是不断变化的,不能真正被缓存(我们会经常使缓存失效)。还有一些叶表,尽管其中一些(2 或 3 个)不会很小(也超过 1m+ 行)。这些叶表包含诸如类别和其他子信息之类的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-05-14
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多