Upgrade to Pro — share decks privately, control downloads, hide ads and more …

空間計算量入門 / Basic Knowledge of Space Complexity

空間計算量入門 / Basic Knowledge of Space Complexity

Basic Knowledge of Space Complexity

Ryo Tomidokoro

April 24, 2019
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Programming

Transcript

  1. 空間計算量の話
    Ryo Tomidokoro
    PHP Study 2019/4/24
    @hanhan1978

    View Slide

  2. 前回までのあらすじ

    View Slide

  3. @hanhan1978は、PHPerKaigi2019で時間計算量のトーク
    をしてきた。しかし、Q&Aで質問されたのは空間計算量につ
    いての質問だったため、何を言っているのかよく分からな
    い。
    ちなみにAsk The Speakerでは、「今、Out of Memoryで
    困ってます。」という人生相談を受けた。
    なので、おそらく顧客が本当に知りたいのは時間計算量
    ではなく、空間計算量。

    View Slide

  4. 時間計算量のおさらい
    ※手抜きではない。

    View Slide

  5. コード例

    View Slide

  6. コードの問題は何?
    仕様は満たしている、動作も問題ない。しかし、データ
    の増大と共に問題を起こす可能性がある。
    実際に、サンプルコードの負荷試験をして、データ量と
    処理時間の関係を確認する。

    View Slide

  7. データ件数と処理時間の関係

    View Slide

  8. データ件数と処理時間の関係

    View Slide

  9. 計算量視点を持つ
    いつものコーディングに、新しい視点として、計算量を
    加えて見よう。

    View Slide

  10. 計算量とは?

    View Slide

  11. 2つの計算量
    時間計算量(Time Complexity)
    プログラムの演算の回数
    空間計算量(Space Complexity)
    プログラムが利用するメモリ使用量

    View Slide

  12. 時間計算量の測り方

    View Slide

  13. 単純な掛け算関数

    View Slide

  14. 単純な掛け算関数

    View Slide

  15. 単純な掛け算関数

    View Slide

  16. O記法 (Big-O notation)
    計算量の目安を表す便利な記法。O記法での表現によっ
    て、そのアルゴリズムがどんな時間計算量特性を持つのか
    を理解できる。
    O(1), O(n), O(n^2), O(n*log n)
    括弧の中身が計算量のオーダーを表す

    View Slide

  17. データ量と時間計算量特性の関係
    [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量
    https://www.techscore.com/

    View Slide

  18. アルゴリズムと計算量
    アルゴリズム 計算量
    バブルソート O(n^2)
    マージソート O(n * log n)
    バイナリーサーチ O(log n)

    View Slide

  19. 計算量視点で最初の例を読み返す

    View Slide

  20. コード例

    View Slide

  21. 計算量オーダーを下げる

    View Slide

  22. 改善例
    ※ $purchased_usersのkeyとvalueを入れ替えておく

    View Slide

  23. 改善例

    View Slide

  24. 改善例

    View Slide

  25. 処理時間を再計測

    View Slide

  26. データ件数と処理時間の関係(改善後)

    View Slide

  27. データ件数と処理時間の関係(改善後)

    View Slide

  28. 計算量という視点を持つことで、プログラム
    が潜在的にもつ問題点を見つけることが出来
    た。
    ※ただし、データ量が少なければ問題ないこ
    とが多いので、無闇に計算量ばかり指摘するの
    はやめましょう。

    View Slide

  29. ここから空間計算量の話

    View Slide

  30. だいたい時間計算量の話と一緒
    手抜きではない...

    View Slide

  31. 例えばこんなプログラム

    View Slide

  32. 例えばこんなプログラム
    1000 + 100 * 5 = 1500(Byte)

    View Slide

  33. PHPにもGCはあるけど、一回のウェブリクエスト中
    では発動しない。
    リクエスト終了後にメモリがクリアされる方が先。
    時間計算量同様に、一個ずつメモリの使用量を計算
    していけば理詰めで算出できる。(する?)

    View Slide

  34. PHPのGC
    https://www.php.net/manual/en/features.gc.php

    View Slide

  35. gc_collect_cycles()を実行すると、強制的にGC
    させられるらしい。
    そういえば、composerもそのへんで一度トラブ
    ルを抱えていたような…

    View Slide

  36. いや、違う

    View Slide

  37. 顧客が本当に求めているのは、空間計算量の話
    でもなく、Allowed memory size of … でエ
    ラーが起きないようにするにはどうしたらいい
    か?
    だった。

    View Slide

  38. Allowed memory size of ..で怒ら
    れなくする話
    Ryo Tomidokoro
    PHP Study 2019/4/24
    @hanhan1978

    View Slide

  39. サンプル

    View Slide

  40. 実行すると

    View Slide

  41. 怒られる

    View Slide

  42. 基本的に無限にメモリを利用するようなプログ
    ラムを書いた場合は、どんなにメモリを積んで
    も避けられない。
    無限にメモリを利用しない場合は、避ける方法
    が何個かある。

    View Slide

  43. たくさんメモリを割り当てる
    ini_set(‘memory_limit’, ‘8G’);
    とかすると、きっと頑張ってくれるが、もちろん根本的解
    決ではない。メモリ量を上回る富豪プログラマーが破産さ
    せてくれるはず。

    View Slide

  44. 最近のfreeコマンドは、available列を表示して
    くれるので、空きメモリ容量が分かりやすい。
    memory_limitを上げるときは空き容量と相談し
    ながら。

    View Slide

  45. 例えばunbuffered query
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
    こうすると、DB側のメモリにリザルトセットを積めるので、クラ
    イアント側はメモリを節約できる。
    けど、これやってる間は他のクエリを受け付けてくれないので、
    用法用量を守らないと事故る。

    View Slide

  46. データ分割
    可変の大量データを扱うのが問題なので、固定量のデータ
    を扱うプログラムに変更すればよい。
    王道だけど、バッチプログラムとかでは再実行性とか冪等
    性に配慮する必要はある。

    View Slide

  47. ファイルIO
    メモリにファイルを全部積むようなプログラムを書くと、
    発生してしまいがち。
    GuzzleとかStreamであつかえるAPIがあるので、そっちを使
    いましょう。
    DropboxAPIとかも大容量ファイルを省メモリで送ることの
    できるAPIをちゃんと準備してくれています。

    View Slide

  48. その他のtips
    memory_get_usage で現在のメモリ使用量を取得することが
    できる。
    これはZend/zend_alloc.cの_zend_mm_heap->sizeを返して
    る。
    バッチとかならvmstatとかでメモリの減り具合を見ても分
    かる。

    View Slide

  49. バッチならまだしも、ウェブアプリでMemory
    allocation ...が出てる場合は、どうせろくで
    もない事をしているに違いない。間違いない。
    とにかく、可変でサイズの大きいデータを扱う
    場合は一次作業場所(メモリ)が限られている
    ことを事前に意識しないと問題が起きがち。

    View Slide

  50. ところで

    View Slide

  51. このmemory allocationのエラーの本当の意味を
    理解するには、PHPのプログラムがどのように実
    行されているのかを知る必要がある。
    すごく細かく説明されているサイトを発見した

    View Slide

  52. https://codingjp.com/web/21119/

    View Slide

  53. PHPが実行されていく過程

    View Slide

  54. Nginx + PHP-FPM, php-cliの場合
    ※諸事情によりApache mod-php駄目絶対マンになったの
    で、今後私からその方面の情報が出てくることは多分な
    い。

    View Slide

  55. View Slide

  56. View Slide

  57. View Slide

  58. View Slide

  59. Allowed memory size of ...
    実行時にmemory_limitをオーバーした場合

    View Slide

  60. Out of memory ...
    実行時に新しいchunkを割り当てられない場合

    View Slide

  61. つまり
    誰か、私と一緒にゆるゆるPHP闇勉強会やろうず

    View Slide

  62. おしまい

    View Slide