SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【linux】viで巨大なファイルを編集するとき

問題

30GBあるファイルがありまして、viで編集は無理そうなんですが、どうやれば編集できますか。

答え

そのまま編集は無理。

分割して、編集して、結合するという方法がある。

$ cat 30gb.txt | split -b 100000000
$ vi xaa
$ cat x* > 30gb2.txt

上の例では、100MB(100000000byte)ごとに分割している。

バイト数ではなくて行数で分割したい場合は以下のようにする。下の例では2000行ごとに分割する。何も指定しなければデフォルトで1000行ずつになる。

$ cat 30gb.txt | split -l 2000
分割にかかる時間の目安

約30GBを100MB×300個に分割するのに、ある環境では約20分かかった。

約30GBを1GB×30個に分割するのに、ある環境では約15分かかった。

メモリの量やディスク書き込み性能、負荷状況によるでしょう。

分割後の編集

以下のように分解されるので、

$ ls -la x*
-rw-r--r-- 1 root root 100000000  1月 13 08:44 2017 xaa
-rw-r--r-- 1 root root 100000000  1月 13 08:44 2017 xab
-rw-r--r-- 1 root root 100000000  1月 13 08:44 2017 xac
(中略)
-rw-r--r-- 1 root root 100000000  1月 13 09:04 2017 xob
-rw-r--r-- 1 root root 100000000  1月 13 09:04 2017 xoc
-rw-r--r-- 1 root root  23236190  1月 13 09:04 2017 xod

100MBくらいならviで編集できる環境であれば、このまま必要な個所を編集して、catで結合する。

結合にかかる時間の目安

100MB×300個を結合するのに、ある環境では20分かかった。

関連するメモ

コメント