【问题标题】:size of the record (in bytes) with ActiverecordActiverecord 的记录大小(以字节为单位)
【发布时间】:2016-03-19 23:13:03
【问题描述】:

有没有一种简单的方法可以使用 activerecord(我的数据库是 mysql)获取记录的大小(就它占用的磁盘空间而言)?

我找到了几个 (1, 2) 答案,提供了一种使用 sql 执行此操作的方法,我想知道 Activerecord 中是否内置了一些东西,例如 MyRecord.first.bytesize

表格大小也可以,我需要平均行大小。

这样做的目的是估计数据库的磁盘空间需求。


更新

我也找到了ObjectSpace.memsize_of

require 'objspace'
ObjectSpace.memsize_of(MyRecord.first)

activerecord对象的大小是否等于数据库中记录的大小?


这似乎给出了所有字段的组合大小。我将所有不响应size 的字段(例如时间戳)转换为字符串。

record.attributes.keys.map{ |attr_name| record.send(attr_name)}.inject{|sum, attr| sum + (attr.respond_to?(:size) ? attr.size : attr.to_s.size)  }

以下是这些方法对同一记录的结果比较:

  • 所有属性的组合大小(见上文):222
  • Marshal::dum(record).size2678
  • ObjectSpace.memsize_of(record)128

【问题讨论】:

  • ActiveRecord 没有内置方法可以做到这一点。
  • 我已经实现了一些可以满足我需求的快速解决方案,并将其打包到 gem 中。我以后可能会改进它...

标签: ruby-on-rails ruby activerecord rails-activerecord


【解决方案1】:

可以使用以下方法找到大小的近似值:

Marshal::dump(obj).size

正如你所说,它用于数据库大小 - 转储具有类和实例变量的名称 - 与绝对记录大小相比,它可能有点开销。

您可能希望查看此答案以获取 MySQL DB 大小 - Database size calculation?How to Get True Size of MySQL Database?

基于当前存储在 DB 中的实体数量,以及使用上述方法确定的大小 - 您可以推断出大小。

【讨论】:

  • Marshal::dump(obj).sizeObjectSpace.memsize_of(obj) 有什么区别?前者返回 10 倍以上的大小。
  • 我不太确定。让我们看看是否还有其他人可以发光。
  • ObjectSpace.memsize_of 将准确表示内存中 Ruby 对象的大小,比Marshal 更准确。两者都不会与数据库行的大小相同。
  • Marshal.dump 将包含所有实例变量,例如与更改跟踪、关联、各种缓存等相关的变量。 Memsize_of 计算 ruby​​ 内存占用量(例如,在 64 位平台上,空数组为 40 字节)并且不包括很多东西
  • 我是这么认为的,这可以解释大小的差异(与我列出的其他两种方法相比)。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2014-01-27
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多