ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:totmon Sortコマンドメモリーオーバー
困り度:
  • すぐに回答を!
sortコマンドで2GBのファイルをソートしよとしたところメモリオーバーのため失敗しました。
sortコマンドの最大メモリーは5GBを指定しています。(sort -S 5000000)
そこでこれを解決するために幾つか質問があります。

1.
-Sで最大メモリを指定しない場合の最大メモリはいくらになるのでしょうか?

2.
Unixのsortコマンドは巨大ファイルをソートするために用途として使用するのに向いているのでしょうか?(使用することはあるのでしょうか?)

3.
解決方法がありましたら宜しくお願いいたいます。

4.
代替案がありましたら宣しくお願い致します。
(メモリーはなるべく消費しない方法)

宜しくお願い致します。
質問投稿日時:07/05/09 10:06
質問番号:2985372
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答10pt

回答者:sakusaker7 2GBのファイルでも失敗したというので気になったのですが、
使用しているsort は、大規模ファイルに対応しているのでしょうか?

Sun Microsystems - Solarisでの実装
http://jp.sun.com/products/software/solaris/wp/Sol_file/sol_5.html

ここを見ると、sortは対応しているものの中に入っていないようですが。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:07/05/11 02:32
回答番号:No.5
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答20pt

回答者:marimari01 いくつか確認させてください

1.実行しているsortのオプションはなんですか?
2.もし、-Sを付けていないならば、10M程度を指定したらどうなりますか?
3.実行しているユーザにリソース制限はありませんか?
ulimit -aで確認してください。
メモリやオープンできるファイル数に制限が無いですか?
種類:補足要求
どんな人:専門家
自信:参考意見
回答日時:07/05/09 19:39
回答番号:No.4
この回答への補足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
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:marimari01 ANo.2の補足

一時領域不足なら、オプションにて一時領域のディレクトリを変更することが出来ますよ。多分 -Tオプション
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:07/05/09 14:52
回答番号:No.3
この回答への補足調べてみましたが、21GBの空きがありました。
この回答へのお礼-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です。  
もしこれからなにかお気づきの点がありましたら宜しくお願い致します。

回答

 

回答者:marimari01 >これからなにか解決方法はわかりますでしょうか?

/var/tmpの空きが一時的に無くなっていませんか?

2Gのファイルをsortするために、結果的に/var/tmpにソート途中の2Gのデータが出力されると思います。
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:07/05/09 14:44
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:marimari01 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
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:07/05/09 11:31
回答番号:No.1
この回答への補足以下のようなエラーが出力されています。
これからなにか解決方法はわかりますでしょうか?

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
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示