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
5
3.3k
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
asayamakk
October 25, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
830
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
920
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
91
30k
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
430
dbt民主化とLLMによる開発ブースト ~ AI Readyな分析サイクルを目指して ~
yoshyum
3
1k
効率的な開発手段として VRTを活用する
ishkawa
0
140
ISUCON研修おかわり会 講義スライド
arfes0e2b3c
1
450
生成AI時代のコンポーネントライブラリの作り方
touyou
1
230
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
730
ソフトウェア品質を数字で捉える技術。事業成長を支えるシステム品質の マネジメント
takuya542
2
13k
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
410
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
260
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
For a Future-Friendly Web
brad_frost
179
9.8k
Rails Girls Zürich Keynote
gr2m
95
14k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Designing Experiences People Love
moore
142
24k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Six Lessons from altMBA
skipperchong
28
3.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
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時に、新 着のおトクな クーポンが登場します。
ブース&この後のセッションでもお会いしましょう!