Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
asayamakk
October 25, 2024
Programming
5
4.3k
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
asayamakk
October 25, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
ロボットのための工場に灯りは要らない
watany
10
2.8k
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
140
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
500
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
130
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
730
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
230
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
570
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
280
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.1k
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.6k
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.3k
The Ralph Wiggum Loop: First Principles of Autonomous Development
sembayui
0
3.7k
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
150
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
640
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
67
37k
A better future with KSS
kneath
240
18k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.1k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
480
Are puppies a ranking factor?
jonoalderson
1
3.1k
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
Fireside Chat
paigeccino
42
3.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Transcript
GMOビューティー株式会社 浅山 広大 カラム追加で増える ActiveRecordの メモリサイズ イメージできますか?
• 1インスタンスあたり何バイト増えるのか 答え・調べ方・どんなオブジェクトが生成されるか • Rubyのメモリのレイアウトについて Rubyのメモリ管理方法(基礎編、最近のアップデート編) 一歩目の踏み出し方 この発表の構成
• Railsで開発していて、メモリ効率・使用量を意識し てARインスタンスを生成するようになる • CRubyの仕組みに興味を持つきっかけになること この発表のゴール・目的
特に断りのない場合 Ruby 3.0, MRI (CRuby), Rails7.1, 64bit CPU での話をしています 前提
🤔< clinicsって参照多いテーブルだけど このコード、どれぐらいメモリ使用量増えるのかな? きっかけ
add_columnすると 何バイト増えるのか (integerの場合)
224バイト
ObjectSpace.memsize_of を使う → インスタンスが持つインスタンス変数までは追えない オブジェクトのメモリサイズの調べ方
ObjectSpace.reachable_objects_from を使う • あるオブジェクトから直接辿れるオブジェクトを返す ◦ 1階層しか辿れないので、探索的に取得する必要がある ◦ ObjectSpace.#reachable_objects_from (Ruby 3.3
リファレンスマニュアル) ◦ https://www.atdot.net/~ko1/diary/201212.html#d8 オブジェクトのメモリサイズの調べ方
startから辿れる全てのオブジェクトを取得 https://www.atdot.net/~ko1/diary/201212.html#d8 より引用(一部改変)
インスタンスのメモリサイズの調べ方 PK+timestamps のARインスタンス → 3716 byte (≒3.6KB)
インスタンスのメモリサイズの調べ方 integerを追加して、追加前後での比較 → 224byte 増加
何が増えたか
増えたオブジェクトを調べる integerの追加前後での比較 String (40byte), ActiveModel::Attribute::FromDatabase (72byte) ActiveModel::Type::Integer (72byte), Range (40byte)
増えたオブジェクトを調べる ①String ②AMの中のTypeの 中のRange
• ActiveModel::Attributeの内部クラス • ActiveRecordの@attributesの@attributesに格納されている • DBからの結果をラップする (typeを持っており、型変換も担う) ActiveModel::Attribute::FromDatabaseはどこから? 定義 取得
参考: 【Rails 6.1】AS 句で作ったカラムに DB の型情報はない - ESM アジャイル事業部 開発者ブログ
増えたオブジェクトを調べる ⇨ 合計で224バイト増
増えたオブジェクトを調べる
CRubyのメモリレイアウトの話
> Ruby で扱える全ての値はオブジェクトです • CRubyではオブジェクトごとに RVALUEと呼ばれる固定長のメモリを割り当て (例外あり) ⇨ RVALUEによってオブジェクトの値を表現 •
RVALUEへのポインタをVALUEと呼ぶ (ポインタじゃないときあり) • VALUEはポインタを格納するので、64bit CPUで8バイト • RVALUEはVALUE 5つ分のサイズ (ヘッダー2つ+ボディ3つ) 8 × 5 = 40byte そもそもオブジェクトって何ですか?
RString構造体 • 文字列が23バイト以内で表せる場合 → RVALUE内に埋め込み (40byte) • 24バイト以上の場合 → len:
バイト列の長さ ptr: バイト列 (mallocで確保される) capa: malloc - 1 (終端文字分を引く)
• • RStruct構造体を使って表現 • bodyに3つのVALUE → 始点・終点・終点を含むかどうか RStruct構造体 (Rangeの例)
増えたオブジェクトを理解する ⇨ 合計で224バイト増
• • RObject構造体を使って表現 • インスタンス変数が3つ以下 → RObject内に埋め込み • 4つ以上の場合 →
ivptr (配列) に値を確保 (malloc) 40(RObject) + 8×4 (ivptrで確保した配列) ⇨ 72byte RObject構造体 (ユーザー定義クラス ActiveModel::Attribute::FromDatabaseなど )
増えたオブジェクトを理解する ⇨ 合計で224バイト増
残りの疑問
> Ruby で扱える全ての値はオブジェクトです • CRubyではオブジェクトごとに RVALUEと呼ばれる固定長のメモリを割り当て (例外あり) ⇨ RVALUEによってオブジェクトの値を表現 •
RVALUEへのポインタをVALUEと呼ぶ (ポインタじゃないときあり) • VALUEはポインタを格納するので、64bit CPUで8バイト • RVALUEはVALUE 5つ分のサイズ (ヘッダー2つ+ボディ3つ) そもそもオブジェクトって何ですか?
VALUE埋め込み表現 (即値、immediate value) • VALUEはポインタ、ではないときがある • ポインタとしてありえない値を使って、VALUEのみで値を表現 ポインタの場合: 下位3bitは必ず0 (8の倍数)
⇨ 下位3bitに1が含まれるときは、VALUE埋め込み表現 • 例: Fixnum (整数値) ◦ VALUEの下位1bitが1のとき ◦ 残りの63bitで整数値を表現 ⇨ -2^62 ~ 2^62 の範囲で表現可能 (FixnumとBignumの境目)
増えたオブジェクトを理解する ⇨ 合計で224バイト増
特に断りのない場合 Ruby 3.0, MRI (CRuby), Rails7.1, 64bit CPU での話をしています 前提
• Ruby 3.2 から埋め込み表現可能な範囲が広がっています VWA (Variable Width Allocation) Optimizing Ruby’s
Memory Layout: Variable Width Allocation - Shopify https://shopify.engineering/ruby-variable-width-allocation
VWA (Variable Width Allocation) • Size Pool という新しい概念が増えた ◦ RVALUEが格納されるslotのサイズが
40, 80, 160, 320, 640byte のどれかに • 埋め込み可能なデータの拡張 ◦ String: 615byteまで埋め込み可能に ◦ Object: 78個のivarまで埋め込み可能に
• Rubyのウラガワ (Web+DB Press連載記事) ◦ 笹田さんの連載 ◦ Rubyのメモリレイアウトをベースにどんな最適化がされ てきたかを解説されてる •
RHCの参考文献を読み漁る ◦ 笹田さんの活動 ◦ https://github.com/ko1/rubyhackchallenge/blob/ma ster/bib.md 参考資料 (CRubyを理解する第一歩として)
まとめ
add_columnすると 何バイト増えるのか (integerの場合)
224バイト
224バイト RVALUEが4個と ivptrでVALUE 4*2個 ActiveModel::Attribute::FromDabase (40+32), ActiveModel::Type::Integer (40+32), String (40),
Range(40)
私たちのスキーマ設計
おまけ
自己&会社紹介
自己紹介 浅山 広大 (asayamakk) GMOビューティーで取締役エンジニアをやってます 趣味は美容医療とキックボクシングと3Dゼルダです。
おトクな割引クーポンの 購入サイト "美容医療で私らしく" 美容医療の検索・予約サービ ス 予約管理から電子カルテ・ 会計までを一括管理 3 つ の
提 供 サ ー ビ ス キレイパスなら、あなたにぴったりな 施術や美容クリニックが見つかる。 チケット購入から予約まで、スムーズ な体験を提供します。 クリニックのDXを加速させ効率的な オペレーションと経営サポートを実現 する美容クリニックの経営支援プラッ トフォームです。 ビューティーサロン・ 美 容 クリニック ・グルメ・ 宿 泊 ・ 通 販 など、 様 々な ジャンルの割引クーポンを掲載中! 毎 日お昼の12時に、新 着のおトクな クーポンが登場します。
ブース&この後のセッションでもお会いしましょう!