これが、現実…ッッ!!
はじめに
こんにちは、12日目担当のまこちゃーんです。さて、ゴリゴリとアプリ開発を行っていく傍ら、僕のPCは悲鳴を上げています。そう、記憶容量が足りないのです。ここに、僕の使っているPCのスペックを以下に載せておきます。
- 内蔵記憶:256GB(うち39GBがシステム使用)
- メモリ:16GB(16GBx1)
- CPU:Intel Core i7-1165G7
これ、人並みよりは良い性能をしているのは間違いないのですが、いかんせん、アプリ開発をする人間にとっては足りないのです…
容量を減らせばいいじゃない?いやいや、そうしたいのは山々ですよ。でも、見てください。
Teamsは授業で使います。Git消すなんてもってのほか!Unity Hubは開発の要…Cubaseは楽曲作成の相棒です…!このように、どのアプリも消せないとしたら、どうしましょう?
この記事では、そんな空き容量との戦いを1年近く続けた戦士による、容量を「空ける」のではなく、容量と「向き合う」ためのHowTo記事です。空けるのを目的とするなら、データの断捨離を行えばいいだけのこと。でも、そうできない時だってあります。そんな状態でやれることは、データを減らすのではなく、このデータをうまく利用することです。そのために、ここでは外部記憶をフル活用します。そして、その外部記憶の使い方をこの記事では3通りご紹介します。
おそらく、この同じような状況に陥るアプリ開発者は多くいると思います(いない?笑)。ぜひこの記事が、そのような人たち(もちろんアプリ開発者に限らず!)に届けば幸いです!
Method1. 階層構造を意識する
階層構造とは
メモリやディスク等の記憶装置は、階層構造を作るように設計されているのはご存じでしょうか?
例えば、上記の画像のように、今使うものだけを置く階層、持続的に保存する階層というように、順次層のように積み重ねる形式をとるのが、メモリ(主記憶装置)とディスクです。メモリのように、今使うものを置く階層を一次記憶、ディスクのように、頻度が少なく、持続的に保存する階層を二次記憶と呼びます。現実世界で例えるのであれば、メモリは作業机、ディスクは本棚でしょうか。
この構造を取るメリットは、やはり効率よくデータを保存することができる点ですね。机が散らかっていては、効率は下がってしまいますが、本棚を活用して区別しながら格納すれば、作業机がすっきりし、作業が効率化されます。では、このメモリとディスクの関係を、Cドライブに応用しましょう!
階層構造を実践しよう
そのために用意するのは、外付けSSDです。いまなら1TBSSDは10,000円ほどで買えます。パソコンを買うより安いです。
僕はこのSSDを買いました。通信速度が高いので不便は全然ないです。
https://amzn.asia/d/craGkrs本手法では、外付けSSDを二次記憶、ローカル記憶領域を一次記憶とみなすことにします。こうすることで、普段頻繁に使用するデータはローカルにおいたままですぐに使用することができ、使用頻度の少ないデータは外付けSSDに退避させることができます。本棚に使用頻度の少ないデータを置いておくイメージです。 当たり前だろ、と思うかもしれませんが、こうやって意識して分割する、というのは重要です。例えば、これを意識しない場合、ただ溢れたデータから外付けSSDに入れる(これをスピルアウトといいます)と思います。これは、頻繁に使うデータがSSDに入ってしまった場合に都度ローカルへのダウンロードが必要になり、コンピュータの使用効率が低下します。やむを得ず外部記憶を使用するので、出来る限り効率を高めることが重要です。
なにを一次記憶にするべき?
じゃあ、頻繁に使うものと言っても、実際には何を一次記憶とすればよいのでしょうか?それを考える上で僕が提案するポイントは、以下の2点です。
- 扱うものはソフトウエアなのか、データなのか
- 扱うものの依存関係はどうなっているのか
- ソフトウエアか、データか
例えば、ローカル環境でソースコードを記述する際に、Pythonのインタプリタ自体を外部記憶に入れるべきしょうか?これはNoです。外付けSSDを繋いでない場合、ローカルでPythonファイルを書くことはできますが、実行はできません。また、環境変数の指定も厄介になります。例えると、本棚に参考書を入れておいて、その勉強のノートだけ机に用意して勉強するようなものです。その場合、またローカルにPythonを入れてしまうのが、まぁ人のSAGAってやつです。 このPython「ファイル」の作成はすなわち、データの作成です。一方、「インタプリタ」はソフトウエアです。インタプリタを実行することでプログラムは動作するため、実際に頻繁に使っているのは、このPythonインタプリタ自身に他なりません。ソフトウェアが頻繁に使われているのです。その実態を無視して二次記憶にソフトウェアを置いてしまうのは、二次記憶の本棚としての役割に従えていません。この差は明確にした方がより効率的に整理をすることができます。今回の例で言えば、インタプリタを一次記憶に置き、Pythonのソースコードは二次記憶に置くのがBest Practiceだと思います。そして、さらに頻繫に使うソースコードのみ、一次記憶に置くなどすれば、より効率的な利用ができると思います。
また、ゲームなどのソフトウェアはどうでしょうか?頻繁にゲームを使うのであれば、一次記憶?? これに関しては、二次記憶に格納することをお勧めします。例え頻繁といえど、ゲームはExcel等のツールのように常時使うものではないからです。遊びたい、と思った時に、腰を据えて外部記憶を接続してプレイするようにして、本当に必要なものに一次記憶を明け渡すのが良いのではないでしょうか。現在、Steamなどのゲーム販売サイトでは、保存先の指定に外部記憶を指定できるようになっています。速度について問題は生じないことが多いため、特別な事情がない場合は二次記憶に格納するのをお勧めします!
- 依存関係はどうなのか
先ほどの例をもう一度使いましょう。データを二次記憶に移し、頻繫に使うもののみ一次記憶に置く際に、自分が実行するPythonファイル1つのみを一次記憶に置くことにしましょう。このプログラムは、正常に動くでしょうか? 答えは、「場合による」です。このPythonファイルが別のPythonファイルのインポートを頻繁に行う場合、1つのみでは、参照が一次記憶と二次記憶の間に渡るため、効率は低下します。最悪の場合は、処理に失敗します。このような場合、容量が大きくなろうとも、参照プログラムごと一次記憶に残すことが必要です。前述した例も、ソースコードがインタプリタに依存することにより生じる問題になります。 ここで紹介した階層構造化は、ちょっと慣れるまで複雑だと思います。ぜひ、実際に触ってみて解釈をした上で、自分自身のBest Practiceを見つけてみてください!
Method2. 外部記憶で動作しないものを見極める
全部外部記憶にいれればいいってもんじゃない?!
例えば、Unityは頻繁に使う時期もあれば、そうじゃない時期もあります。なら、ソフトウェアとデータをどちらも外部記憶に配置しておいて、外部記憶上で実行すればいいんじゃないのか?と思われるかもしれません。僕もそう思っていました。ですが、実際に触ってみて気づきました。 UnityHubに限っては、外部記憶で動作できない...!!!! これは盲点でした… 一応、Method1 で述べたようなインタプリタやゲームなどの、所謂データを扱うためのソフトウェアはどれも外部記憶上で動きます。しかしながら、UnityHubに限っては、そうした場合に正常な動作が出来ないのです…! これに関しては、そのソフトウェアが、一体Cドライブのどんな隠しファイルと依存関係を持っているかに一任されます。例えばSteamは外部記憶上で実行でき、さらにそこからダウンロードしたゲームも、Steamに対してのみ依存関係を持つため、実行することが出来ました。しかし、どうやらUnityHubはインストール時に色々な場所に設定ファイルを散りばめてしまうようで、exeファイルが入っているフォルダを移すだけでは外部記憶での動作はできません。 もし、依存関係まですべて理解できるのであれば、それはどうぞ移行してくだされ~って話なのですが、この記事はあくまでアプリ屋さんへの記事なので、そこまで低レイヤになる話は除いていきます。
さて、このように、結構インストーラ経由でインストールしたアプリは、竹のようにCドライブに深く根付いてしまうものもあります。これをどうするか?ここでこの記事のテーマに戻りましょう。そうすれば、このような結論に至れるはずです。 このようなファイルをどうするかではなく、このファイルのためにCドライブを利用する 外部に動かせないファイルが容量問題なしにスムーズに動作できるように、その他の部分で外部記憶を活用できるようにする、というのが必要なことです。
どう見極める?
さて、ここが大事ですね。とはいいつつ、なかなかこれは難しい問題です。なんせどのようなファイルが展開されるかは、そのソフトウェアを作成した人又は解析を行える人にしか分かりようがないですからね。
対処療法的ですが、1つ見極め方をお伝えします。それは、
インストーラにおいて、ダウンロードディレクトリの選択ができるものは、外部記憶に移行できる
です。
インストーラで何も考えずにnextを押す人、多いですよね。でも、その時にふと確認してみてください。そして、選択できるのであれば、それは外部記憶の出番です。うまく活用しましょう。そうして、Cドライブでのみ動作するもののみ残してゆけば、だんだんと逼迫さは解消されていくでしょう。
Method3. ローカル環境主義を捨て、役割ごとの環境へ
ローカル環境万歳!!SSHクソくらえ!な人へ
止めましょう。お勧めはしませんよ~。
大学の講義を受けてると、大学の提供する計算機での動作を前提としたプログラム課題が出ることが多くあります。その度に、何人かは声を挙げます。
「SSHめんどくさいからローカルに立てりゃよくね?」
まぁ、合理的な判断ではあります。自分のパソコン内に構築できればいつでも触れますし、なにせ慣れてる環境ですからね。このような、外部の環境をGithub等を通じて丸ごと自身の環境に移築する人々をここではローカル環境主義者と呼んでいます。
しかし、この記事の目的を果たすのであれば、この主義は諦めてもらう方が良いです。その理由は主に2つです。
- プロジェクトのダウンロードにとどまらず、多数の依存関係のダウンロードも必要となる
- 既存の他のソフトウェアと競合を起こす可能性がある
依存関係をやみくもに増やすことで、先に述べた深くまで根付くプログラムが発生してしまいます。そうなってしまうと、なかなか整理は難しくなります。また、入れた環境が、自身の環境の設定とは相反する場合、環境の変更、又は環境管理ツールの利用が必要になります。環境管理ツールも、少数であればよいですが、やはり多くなってしまうと、深くまで根付いてしまいます。ローカル環境の負荷を減らしたいのであれば、このような副作用は望ましくありません。
この事象の問題点は、Excelなどの定常業務を行う端末と、実行端末が一緒になってしまっている点です。そのような場合に対しては、別の環境を用意するとよいでしょう。
環境別に分ける
このような方法の場合、外部記憶に対して環境を丸ごと移行します。例えば、Pythonのインタプリタとソースコードをフォルダごとすべて移す、といったことを指します。これは、Method1, 2で取った手法とは異なる手法です。
Pythonのインタプリタを外部記憶に入れるべきではない、というのは、ローカル環境にソースコードを記載する場合でした。ですが、この場合は、どちらも外部記憶内に格納します。その場合、外部記憶とCドライブでの通信の必要はありませんから、実行上の問題は生じません。
このような場合、実際にはどのようにすればよいかと言えば、インタプリタのパスをDドライブ内のファイル位置に修正すればよいです。その場合、外部記憶が接続されていなければPythonは実行できません。つまり、環境を完全に分割しているのです。
アプリ屋さんにとって、容量を一番逼迫するのは、各開発環境だと思います。それが、ExcelだったりChromeといった普段の動作に影響を与えるのは、PC全体の利用効率が下がってしまうことに繋がります。
管理者権限には注意
この方法を採る場合、外部記憶のフォルダに付与されている権限には注意が必要です。一般に、外部記憶のフォルダは、admin権限のみフルアクセスが可能なことが多いです。それを知らずに移行を行うと…
あれ、環境は同じなのに、pythonコマンドが実行できない… / fvmコマンドが実行できない… / ファイルディスクリプタが書き込みに失敗する…
なんてことが起きてしまいます(経験談)。この権限周辺にはよく気を付けてください。権限を明確に付与し、それさえ乗り越えれば、きっと高い開発快適性を発揮してくれるはずです。
さいごに
このように、本記事では、
- 階層構造化する
- Cドライブでのみ動作するものと区別をする
- 別環境化する
という3つの視点から、容量と向き合う方法を書いてみました。
そういう僕は、どのような構造にしているかといいますと、僕はこの3点を組み合わせています。Cドライブには、頻繁に使うPython環境のみ用意(Method1)し、dartやJava、Goは外部記憶にて実行できる環境を整えています(Method3)。そして、DAWやUnityHubといったCドライブでのみ動作するものをCドライブに配置することで(Method2)、現在の空き容量は以下のようになりました!
ただが2GB、されど2GB。この容量が空いているだけでもありがたいものです!
ぜひ、この記事をみて同じような悩みの一助になる方が出れば僥倖です。それでは、最後までご覧いただきありがとうございました!