【问题标题】:Handling large ActiveRecord object set as binary data将大型 ActiveRecord 对象集处理为二进制数据
【发布时间】:2009-11-20 16:06:37
【问题描述】:

我在处理大量 ActiveRecord 模型类型的记录对象时遇到问题(记录是从复杂操作中提取但从同一个表中提取的),我想在控制器操作之间传递该对象集。所以我有几个解决方案,但对于选择哪种方式很重要。更简单但更丑陋的解决方案是将其保存在会话中。但据我所知,在会话中保存大型对象集显然会降低应用程序的性能,因为频繁的序列化和反序列化过程(我猜从 Web 服务 - SOAP 和二进制格式来看,序列化很耗时)。第二种似乎很有希望的选择是将所有这些 ActiveRecord 模型对象作为博客保存在数据库中,并且通过一个查询,我们可以检索所有数据并可以对该数据集进行必要的操作。但是我不知道如何在从数据库中检索到所有对象后遍历所有对象,因为它仍然是二进制对象格式。调用检查方法会显示所有属性和值,但我完全感到困惑。谁能告诉我如何将 ActiveRecord 模型类型对象保存为单个记录二进制对象并检索它并遍历数据集。我需要像 Base64 这样的编码吗?最后 memcached 会产生预期的结果吗?或者至少有任何链接可以解决这个问题?

对于这个冗长的问题,我们深表歉意,并在此先感谢您。

【问题讨论】:

  • 您考虑过使用 Ajax 吗?我不知道我是否可以更深入地了解您为什么需要保留 blob

标签: ruby-on-rails ruby binary blogs


【解决方案1】:

答案,我讨厌这样说,可能是方法有缺陷。是否需要更多时间来再次查询这些确切的数据或加载 BLOB 行并反序列化它?我的猜测是,在没有索引的情况下,它花费的时间大致相同,但有了索引,您甚至可以更快地从数据库中获取整个结果集,甚至比在没有反序列化调用的情况下加载 BLOB 还要快。

现在也许我错了,但是返回的数据量肯定是大致相同的,所以大部分 db 时间是完全相同的。

Memcached 在这里肯定会很有帮助,但只是以与查询缓存相同的方式(假设您使用的是 MySQL)会有所帮助。假设缓存在任何一种情况下都足够大以适合对象,则任何一种方法都应该快速返回对同一事物的重复查询。

但是您是正确的,在会话中存储是一种不好的方式,并且 BLOB 可能最多也与再次执行查询并让查询缓存返回它大致相同。

但只是为了涵盖所有基础,总数据集有多大与返回的数据有多少以及您看到查询需要多长时间?我猜这篇文章实际上是关于性能的,但被实现细节所笼罩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-02-23
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多