はじめに
この記事はRust 3 Advent Calendar 2020の3日目です。
ここ一年ほどで、Rustの広まりを感じることが増えてきました。大手IT企業や先端的なベンチャーでの採用事例がよくニュースになりますが、個人的にはRustと縁遠いと思っていた分野で思いがけずRustのコードに出会う方が、より広まりを感じます。(RustはリポジトリルートにCargo.tomlがあるのですぐわかりますね)
この記事では、遺伝子解析の分野でのRustの利用について紹介します。
遺伝子解析とは
遺伝子解析とは、生物(ヒトだったり微生物だったりいろいろな研究対象があります)のDNAをシーケンサという機械で読み取ってデータ化したものを解析する、という分野らしいです。
よく行われる解析としては、あるDNAと別のDNAがどれくらい似ているかを調べたり、バラバラに断片化したDNAを元の一繋ぎに復元したり、というような感じのようです。(他にもいろいろあると思いますが、私はこれくらいしか知りません)
私はこの分野は全くの門外漢なのですが、最近会社の同僚が関わっているらしく、GitHubなどでそれらしいリポジトリを見かけて興味をもって覗いたりしているうちに、意外とRustが使われているらしいことに気づきました。
Rustと遺伝子解析
Rustを使った遺伝子解析に関するツールとしては、以下のようなものが見つかります。
(どのツールがメジャーとかはわからないのでcrates.ioのダウンロード数の多いものを並べてみました)
https://github.com/sstadick/rust-lapper
https://github.com/onecodex/finch-rs
https://github.com/10XGenomics/rust-debruijn
https://github.com/rust-bio/rust-bio-tools
https://github.com/varlociraptor/varlociraptor
https://github.com/pkalivas/radiate
見ての通り「一人Rustが趣味の人がいる」というわけではなく、いろいろな人が使っているようです。
作者は大学の研究者といった感じの方が多いですが、例えば上で挙げたリポジトリにある10XGenomicsというのは遺伝子解析のベンチャー企業のようで、GitHub上には同社製のRustツールがいくつも見つかります。
充実したREADMEが書かれたツールも多く、実際に使われていることを感じさせます。
(大学だと研究室内で共有するようなことが多いのでしょうか)
Rustがなぜ遺伝子解析に使われるのかというと、扱うデータのサイズが大きく、解析時間の短縮が重要なためだと思われます。
多くのリポジトリで既存のツールに対しての速度向上がうたわれています。
マルチスレッドを生かした高速化の例も多いです。これまで高速なマルチスレッドプログラミングをするためにはC/C++を使うのが一般的でしたが、データ競合を避けつつバグのないマルチスレッドプログラムを書くのは、その道の専門家でも簡単ではありません。
それに対し、Rustではコンパイラがデータ競合をチェックできるという特性があります。そのためコンパイルを通すハードルは高いものの、実行時に再現性の低い原因不明のバグに悩まされる、といったことは少なくなっています。こういった点がRustが使われる要因の一つになっているのではないかと思います。
また、Rustには高機能な並列処理ライブラリとしてcrossbeamやrayonといったものがあり、これらを使ったツールもよく見られます。
実際の研究者の話
この記事を書こうと思ったのは、以下の記事を見て遺伝子解析分野でRustをよく見かけることを思い出したからです。
Why scientists are turning to Rust
記事中では上で紹介したリポジトリでも活動されているJohannes Köster氏がなぜRustを使うようになったかについて答えています。
また、この記事を紹介するredditのスレッドでは、研究でRustを使っているらしい人が多数コメントしているので覗いてみると面白いかもしれません。