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
空間計算量入門 / Basic Knowledge of Space Complexity
Search
Ryo Tomidokoro
April 24, 2019
Programming
2
770
空間計算量入門 / Basic Knowledge of Space Complexity
Basic Knowledge of Space Complexity
Ryo Tomidokoro
April 24, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
3k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
4
1.2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
4.6k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
13
11k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
0
790
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
1.8k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
1
3k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
hanhan1978
0
1.5k
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
380
Other Decks in Programming
See All in Programming
C# 大統一理論推進委員会 会員のための Unity Package Manager プロジェクト構成案
monry
PRO
0
580
マイ隙間家具OSSたちのご紹介
karupanerura
2
160
どうしてこうなった命名集 ~🔥編~ / OOC 2024 LT
pictiny
4
2.9k
フロントエンドパフォーマンス 入門
shouta2
7
1.5k
SwiftUI, Jetpack Composeの導入で変化した「家族アルバム みてね」のアプリ開発体験
hicka04
6
400
Laravel標準バリデーションでできること
hmb_ok
2
360
「コンパイル時のユニットテスト」導入するとユニットテストを 書かなくてよくなるのか?
tomohisa
9
2.2k
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
1
160
とにかくHTTP3をライトニングに話す / Anyway, I'll talk to Lightning about HTTP3.
seike460
PRO
0
120
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
1.5k
The Future of C++ Interoperability: Insights from Porting a Game to Swift
teamhimeh
0
280
オブジェクトしこう
okuramasafumi
2
130
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
174
21k
Unsuck your backbone
ammeep
661
56k
Navigating Team Friction
lara
177
13k
Robots, Beer and Maslow
schacon
PRO
154
7.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
644
57k
Testing 201, or: Great Expectations
jmmastey
27
6.3k
Gamification - CAS2011
davidbonilla
76
4.5k
Clear Off the Table
cherdarchuk
82
310k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
6.8k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
153
14k
Designing on Purpose - Digital PM Summit 2013
jponch
109
6.4k
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
178
11k
Transcript
空間計算量の話 Ryo Tomidokoro PHP Study 2019/4/24 @hanhan1978
前回までのあらすじ
@hanhan1978は、PHPerKaigi2019で時間計算量のトーク をしてきた。しかし、Q&Aで質問されたのは空間計算量につ いての質問だったため、何を言っているのかよく分からな い。 ちなみにAsk The Speakerでは、「今、Out of Memoryで 困ってます。」という人生相談を受けた。
なので、おそらく顧客が本当に知りたいのは時間計算量 ではなく、空間計算量。
時間計算量のおさらい ※手抜きではない。
コード例
コードの問題は何? 仕様は満たしている、動作も問題ない。しかし、データ の増大と共に問題を起こす可能性がある。 実際に、サンプルコードの負荷試験をして、データ量と 処理時間の関係を確認する。
データ件数と処理時間の関係
データ件数と処理時間の関係
計算量視点を持つ いつものコーディングに、新しい視点として、計算量を 加えて見よう。
計算量とは?
2つの計算量 時間計算量(Time Complexity) プログラムの演算の回数 空間計算量(Space Complexity) プログラムが利用するメモリ使用量
時間計算量の測り方
単純な掛け算関数
単純な掛け算関数
単純な掛け算関数
O記法 (Big-O notation) 計算量の目安を表す便利な記法。O記法での表現によっ て、そのアルゴリズムがどんな時間計算量特性を持つのか を理解できる。 O(1), O(n), O(n^2), O(n*log
n) 括弧の中身が計算量のオーダーを表す
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/
アルゴリズムと計算量 アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n * log n)
バイナリーサーチ O(log n)
計算量視点で最初の例を読み返す
コード例
計算量オーダーを下げる
改善例 ※ $purchased_usersのkeyとvalueを入れ替えておく
改善例
改善例
処理時間を再計測
データ件数と処理時間の関係(改善後)
データ件数と処理時間の関係(改善後)
計算量という視点を持つことで、プログラム が潜在的にもつ問題点を見つけることが出来 た。 ※ただし、データ量が少なければ問題ないこ とが多いので、無闇に計算量ばかり指摘するの はやめましょう。
ここから空間計算量の話
だいたい時間計算量の話と一緒 手抜きではない...
例えばこんなプログラム
例えばこんなプログラム 1000 + 100 * 5 = 1500(Byte)
PHPにもGCはあるけど、一回のウェブリクエスト中 では発動しない。 リクエスト終了後にメモリがクリアされる方が先。 時間計算量同様に、一個ずつメモリの使用量を計算 していけば理詰めで算出できる。(する?)
PHPのGC https://www.php.net/manual/en/features.gc.php
gc_collect_cycles()を実行すると、強制的にGC させられるらしい。 そういえば、composerもそのへんで一度トラブ ルを抱えていたような…
いや、違う
顧客が本当に求めているのは、空間計算量の話 でもなく、Allowed memory size of … でエ ラーが起きないようにするにはどうしたらいい か? だった。
Allowed memory size of ..で怒ら れなくする話 Ryo Tomidokoro PHP Study
2019/4/24 @hanhan1978
サンプル
実行すると
怒られる
基本的に無限にメモリを利用するようなプログ ラムを書いた場合は、どんなにメモリを積んで も避けられない。 無限にメモリを利用しない場合は、避ける方法 が何個かある。
たくさんメモリを割り当てる ini_set(‘memory_limit’, ‘8G’); とかすると、きっと頑張ってくれるが、もちろん根本的解 決ではない。メモリ量を上回る富豪プログラマーが破産さ せてくれるはず。
最近のfreeコマンドは、available列を表示して くれるので、空きメモリ容量が分かりやすい。 memory_limitを上げるときは空き容量と相談し ながら。
例えばunbuffered query $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); こうすると、DB側のメモリにリザルトセットを積めるので、クラ イアント側はメモリを節約できる。 けど、これやってる間は他のクエリを受け付けてくれないので、 用法用量を守らないと事故る。
データ分割 可変の大量データを扱うのが問題なので、固定量のデータ を扱うプログラムに変更すればよい。 王道だけど、バッチプログラムとかでは再実行性とか冪等 性に配慮する必要はある。
ファイルIO メモリにファイルを全部積むようなプログラムを書くと、 発生してしまいがち。 GuzzleとかStreamであつかえるAPIがあるので、そっちを使 いましょう。 DropboxAPIとかも大容量ファイルを省メモリで送ることの できるAPIをちゃんと準備してくれています。
その他のtips memory_get_usage で現在のメモリ使用量を取得することが できる。 これはZend/zend_alloc.cの_zend_mm_heap->sizeを返して る。 バッチとかならvmstatとかでメモリの減り具合を見ても分 かる。
バッチならまだしも、ウェブアプリでMemory allocation ...が出てる場合は、どうせろくで もない事をしているに違いない。間違いない。 とにかく、可変でサイズの大きいデータを扱う 場合は一次作業場所(メモリ)が限られている ことを事前に意識しないと問題が起きがち。
ところで
このmemory allocationのエラーの本当の意味を 理解するには、PHPのプログラムがどのように実 行されているのかを知る必要がある。 すごく細かく説明されているサイトを発見した
https://codingjp.com/web/21119/
PHPが実行されていく過程
Nginx + PHP-FPM, php-cliの場合 ※諸事情によりApache mod-php駄目絶対マンになったの で、今後私からその方面の情報が出てくることは多分な い。
None
None
None
None
Allowed memory size of ... 実行時にmemory_limitをオーバーした場合
Out of memory ... 実行時に新しいchunkを割り当てられない場合
つまり 誰か、私と一緒にゆるゆるPHP闇勉強会やろうず
おしまい