- ベストアンサー
Sortコマンドメモリーオーバー
sortコマンドで2GBのファイルをソートしよとしたところメモリオーバーのため失敗しました。 sortコマンドの最大メモリーは5GBを指定しています。(sort -S 5000000) そこでこれを解決するために幾つか質問があります。 1. -Sで最大メモリを指定しない場合の最大メモリはいくらになるのでしょうか? 2. Unixのsortコマンドは巨大ファイルをソートするために用途として使用するのに向いているのでしょうか?(使用することはあるのでしょうか?) 3. 解決方法がありましたら宜しくお願いいたいます。 4. 代替案がありましたら宣しくお願い致します。 (メモリーはなるべく消費しない方法) 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
いくつか確認させてください 1.実行しているsortのオプションはなんですか? 2.もし、-Sを付けていないならば、10M程度を指定したらどうなりますか? 3.実行しているユーザにリソース制限はありませんか? ulimit -aで確認してください。 メモリやオープンできるファイル数に制限が無いですか?
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
2GBのファイルでも失敗したというので気になったのですが、 使用しているsort は、大規模ファイルに対応しているのでしょうか? Sun Microsystems - Solarisでの実装 http://jp.sun.com/products/software/solaris/wp/Sol_file/sol_5.html ここを見ると、sortは対応しているものの中に入っていないようですが。
ANo.2の補足 一時領域不足なら、オプションにて一時領域のディレクトリを変更することが出来ますよ。多分 -Tオプション
お礼
-Tで一時領域を変更し十分容量があるところを指定し実行しましたが同じエラーになりました。 sort: missing NEWLINE added at end of input file /test1/stmAAAGaayLt.00000001 sort: insufficient memory; use -S option to increase allocation swap -sでswap領域を確認したところ以下のような結果になりました。 実行前 6330008k 実行直後1335240k しばらく1335240kを維持 エラーの手前で少しずつ減少 1016400k 1016384k 1GBの余裕を残してエラー 1012280k swapは1GB余裕がありますがエラーとなりました。 恐らくswapメモリも必要と考えられます。 現在ソート使用しているファイルの容量は616Mです。 もしこれからなにかお気づきの点がありましたら宜しくお願い致します。
補足
調べてみましたが、21GBの空きがありました。
>これからなにか解決方法はわかりますでしょうか? /var/tmpの空きが一時的に無くなっていませんか? 2Gのファイルをsortするために、結果的に/var/tmpにソート途中の2Gのデータが出力されると思います。
1.メモリサイズを指定しなければ、搭載されているメモリの許す限りだと思うのですが。 また、5Gを指定しても、CPUが32bitだと確保できませんね。 2.これについては答えられません。 3.メモリサイズ指定を逆に小さく(500Mbyte程度)で指定して出来ませんかね? メモリサイズ指定は、無制限に使用されると困るので、「指定範囲内でソートしないさい」という意味だと思うのですが。 この場合、メモリに入りきらない分はテンポラリファイルに吐き出しながらソートすると思うのですが。 4. headとtailを使用して、2Gのファイルを500M×4程度に分割し、 分割したファイルをそれぞれsortし、 sort後のファイルをsortのマージ機能で結合してはいかがですか? マージ機能はあらかじめソートしたファイルを結合する(もちろんレコード毎の大小比較して並べます)だけなので、 メモリはほとんど消費しない(最大レコード長×入力ファイル数 byte程度)はず。 例:10000行のデータ(data)を4分割 head -n 2500 data > data1 head -n 5000 data | tail -n 2500 > data2 head -n 7500 data | tail -n 2500 > data3 tail -n 2500 data > data4 sort data1 > sortdata1 ※2~3省略 sort -m srotdata1 srotdata2 srotdata3 srotdata4 > outfile
補足
以下のようなエラーが出力されています。 これからなにか解決方法はわかりますでしょうか? sort: missing NEWLINE added at end of input file /var/tmp/stmAAA9zaWG6.00000001 sort: missing NEWLINE added at end of input file /var/tmp/stmAAA9zaWG6.00000002 sort: missing NEWLINE added at end of input file /var/tmp/stmAAA9zaWG6.00000003 sort: missing NEWLINE added at end of input file /var/tmp/stmAAA9zaWG6.00000004 sort: insufficient memory; use -S option to increase allocation
補足
1.以下になります。 sort -S 5000000 -k 1.67,1.68 -k 1.69,1.71 -k 1.48,1.48 -k 1.49,1.58 -k 1.65,1.66 -k 1.64,1.64 -k 1.6,1.15 -k 1.16,1.25 -k 1.934,1.934 -k 1.59,1.63 -k 1.154,1.154 -k 1.1019,1.1019 -k 1.1018,1.1018 -k 1.1021,1.1021 -k 1.1022,1.1022 -k 1.933r,1.933 in.txt > out.txt 2.-Sを指定しています。 3. bash-2.05$ ulimit -a core file size (blocks) unlimited data seg size (kbytes) unlimited file size (blocks) unlimited open files 1024 pipe size (512 bytes) 10 stack size (kbytes) 8192 cpu time (seconds) unlimited max user processes 29995 virtual memory (kbytes) unlimited 宜しくお願い致します。 また、-Sで12GBを指定し2GBのファイルをソートしましたが同じ結果となりだめでした。 スワップメモリではなく以下のメッセージが原因ではないかと考えております。 sort: missing NEWLINE added at end of input file /var/tmp/stmAAA9zaWG6.00000001