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
asayamakk
October 25, 2024
Programming
4.6k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
asayamakk
October 25, 2024
Other Decks in Programming
See All in Programming
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
5分で問診!Composer セキュリティ健康診断
codmoninc
0
560
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
210
フィードバックで育てるAI開発
kotaminato
1
120
Foundation Models frameworkで画像分析
ryodeveloper
1
130
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
430
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
140
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
530
What's New in Android 2026
veronikapj
0
130
初めてのKubernetes 本番運用でハマった話
oku053
0
130
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
HDC tutorial
michielstock
2
750
The Spectacular Lies of Maps
axbom
PRO
1
870
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
410
Deep Space Network (abreviated)
tonyrice
0
230
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
340
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Faster Mobile Websites
deanohume
310
32k
Balancing Empowerment & Direction
lara
6
1.2k
Odyssey Design
rkendrick25
PRO
2
730
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
180
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時に、新 着のおトクな クーポンが登場します。
ブース&この後のセッションでもお会いしましょう!