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
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
17
6.6k
開発に寄りそう自動テストの実現
goyoki
1
360
20 years of Symfony, what's next?
fabpot
2
310
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.4k
【CA.ai #3】Google ADKを活用したAI Agent開発と運用知見
harappa80
0
260
How Software Deployment tools have changed in the past 20 years
geshan
0
28k
AIコーディングエージェント(skywork)
kondai24
0
110
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
2
1.1k
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
210
Evolving NEWT’s TypeScript Backend for the AI-Driven Era
xpromx
0
260
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
110
FluorTracer / RayTracingCamp11
kugimasa
0
180
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
The Language of Interfaces
destraynor
162
25k
GitHub's CSS Performance
jonrohan
1032
470k
It's Worth the Effort
3n
187
29k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
Agile that works and the tools we love
rasmusluckow
331
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
Mobile First: as difficult as doing things right
swwweet
225
10k
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時に、新 着のおトクな クーポンが登場します。
ブース&この後のセッションでもお会いしましょう!