https://zenn.dev/saka1/articles/0498f7c8dbdba8

巨大なテキストファイルをソートする問題について、sortコマンドの挙動を中心にAmazon EC2インスタンス上で検証を行いました。その結果を記事にまとめたものです。

お題の説明

先日のTwitterでこんな話題がありました。論旨としては、非常に大きくメインメモリに収まらないサイズのテキストファイルをソートしたい場合にどうすればよいか、というものです。

解法はさまざまなものがありえると思いますが、この記事ではsortコマンドによるソートを試してみました。

一般論としての解法

stackoverflowなどを軽く眺める限りだと「普通のsortコマンドが最良ではないか」「GNUのsortは入力が大きい場合は外部ソートをしてくれる」などの回答が見つかります。

この回答は、個人的には納得できるものです。もっとも、2022年現在のハードウェアでも同じ結論になるのか、あるいは具体的にどれぐらい時間がかかるのかは、それほど明らかではないように感じました。

実験

そこで、実際に100GB程度のファイルを作り、ソートしてみます。

条件に当てはまる環境として、今回はAWSのc6id.4xlargeを使うことにします。Intel系のインスタンスでは記事執筆時点の最新世代(IceLake-SP)で、950GBのNVMe SSDが付いています。一時ファイルを置く領域のことを考えても十分な容量があります。

検証環境の構築

NVMe SSDを使えるようにするためにはマウント等の処理が要るのですが、難しいことを考えない限りはクラスメソッドの記事のコマンドをそのまま打つだけでいいです。https://dev.classmethod.jp/articles/howto-ec2-volatile-block-storage-instance-store/

sudo mkfs -t xfs /dev/nvme1n1
sudo mkdir /data
sudo mount /dev/nvme1n1 /data

sudo chown ubuntu:ubuntu /data
cd /data
mkdir part tmp

ダミーテキストの生成

100GBのテキストを準備するのは意外と大変です。 雑なスクリプトだと生成が遅くて困ったので、C/C++でざっと書くことにしました。