Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
Search
asayamakk
October 25, 2024
Programming
5
3.9k
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
asayamakk
October 25, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
CloudNative Days Winter 2025: 一週間で作る低レイヤコンテナランタイム
ternbusty
7
1.8k
Java_プロセスのメモリ監視の落とし穴_NMT_で見抜けない_glibc_キャッシュ問題_.pdf
ntt_dsol_java
0
230
jakarta-security-jjug-ccc-2025-fall
tnagao7
0
100
flutter_kaigi_2025.pdf
kyoheig3
2
380
CloudflareのSandbox SDKを試してみた
syumai
0
180
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
150
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
11k
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
14k
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
100
オフライン対応!Flutterアプリに全文検索エンジンを実装する @FlutterKaigi2025
itsmedreamwalker
2
320
アーキテクチャと考える迷子にならない開発者テスト
irof
9
3.4k
AI時代もSEOを頑張っている話
shirahama_x
0
190
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.1k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
GitHub's CSS Performance
jonrohan
1032
470k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
67k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Music & Morning Musume
bryan
46
7k
Agile that works and the tools we love
rasmusluckow
331
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
2.9k
Code Review Best Practice
trishagee
72
19k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
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時に、新 着のおトクな クーポンが登場します。
ブース&この後のセッションでもお会いしましょう!