• ベストアンサー

Sortコマンドメモリーオーバー

sortコマンドで2GBのファイルをソートしよとしたところメモリオーバーのため失敗しました。 sortコマンドの最大メモリーは5GBを指定しています。(sort -S 5000000) そこでこれを解決するために幾つか質問があります。 1. -Sで最大メモリを指定しない場合の最大メモリはいくらになるのでしょうか? 2. Unixのsortコマンドは巨大ファイルをソートするために用途として使用するのに向いているのでしょうか?(使用することはあるのでしょうか?) 3. 解決方法がありましたら宜しくお願いいたいます。 4. 代替案がありましたら宣しくお願い致します。 (メモリーはなるべく消費しない方法) 宜しくお願い致します。

  • totmon
  • お礼率66% (213/319)

質問者が選んだベストアンサー

  • ベストアンサー
noname#246547
noname#246547
回答No.4

いくつか確認させてください 1.実行しているsortのオプションはなんですか? 2.もし、-Sを付けていないならば、10M程度を指定したらどうなりますか? 3.実行しているユーザにリソース制限はありませんか? ulimit -aで確認してください。 メモリやオープンできるファイル数に制限が無いですか?

totmon
質問者

補足

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

その他の回答 (4)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

2GBのファイルでも失敗したというので気になったのですが、 使用しているsort は、大規模ファイルに対応しているのでしょうか? Sun Microsystems - Solarisでの実装 http://jp.sun.com/products/software/solaris/wp/Sol_file/sol_5.html ここを見ると、sortは対応しているものの中に入っていないようですが。

noname#246547
noname#246547
回答No.3

ANo.2の補足 一時領域不足なら、オプションにて一時領域のディレクトリを変更することが出来ますよ。多分 -Tオプション

totmon
質問者

お礼

-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です。   もしこれからなにかお気づきの点がありましたら宜しくお願い致します。

totmon
質問者

補足

調べてみましたが、21GBの空きがありました。

noname#246547
noname#246547
回答No.2

>これからなにか解決方法はわかりますでしょうか? /var/tmpの空きが一時的に無くなっていませんか? 2Gのファイルをsortするために、結果的に/var/tmpにソート途中の2Gのデータが出力されると思います。

noname#246547
noname#246547
回答No.1

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

totmon
質問者

補足

以下のようなエラーが出力されています。 これからなにか解決方法はわかりますでしょうか? 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

関連するQ&A

  • sortコマンドについて

    いつもお世話になっております。 sortコマンドについて質問させて下さい。 現在UNIXコマンドのsortによってファイルをソートしようとしています。 ソート対象となるファイルは下記の通りです。 ファイルの種類:csvファイル ファイルサイズ:80MByte 1レコード長:48Byte レコード数:120万レコード レコード例: 2,1000 ,1,10C0,15,0000000100000000000000000000000000000000 2,1117 ,1,10B0,16,0000000300000000000000000000000100000000 ・ ・ ・ そこで下記のようなコマンドにてソートしています。 sort -t, -k 1,1 -k 2,2 -k 3,3 -k 4,4 < fileA.csv > fileB.csv すると「sort:0653-657ソート中に書込みエラーが発生しました。」と出力され中断してしまいます。 自分なりにsortコマンドについて調べてみたところ、 /usr/tmpディレクトリのファイルシステムがいっぱいになることでコマンドが失敗しているようです。 (一時的にそのディレクトリにソート内容を展開しているようでした) 社内にて/usr/tmpディレクトリのファイルシステムの拡張を求めたところ「できない」と言われてしまいました。 開発の最終段階でのボリュームテストを行ったときの障害でしたので、 処理を大幅に変更するような対処は出来ない状況です。 代替方法などありましたらご教示頂きたいと思います。 以上、宜しくお願い致します。

  • C言語でファイルの中身をソートするコマンド

    unixのsortのようなコマンドはC言語にあるのでしょうか。 配列のソートではなくてファイルに対してのコマンドです。 sortをsystem()で使用すれば良いのでしょうが、C言語のコマンドにあると聞きました。おそらくunix関連のC言語のコマンドだと思うのですが。

  • UNIXのソートコマンドについて

    はじめまして、UNIXのsortコマンドについて質問です。 CSVファイルをソートする際、1行目がタイトル行で2行目以降をソートしたいのですがよい方法をご存知ですか? OSはSunOSでバージョンは3.8くらいだったと思います。 よろしくお願いします。

  • sortコマンドについて

    Unixのソートコマンドを用いて複数ソートキーを指定し、 ソートキーに応じて昇順降順を指定することはできるでしょうか? 宜しくお願い致します。 第一ソートキー 昇順 第二ソートキー 降順 第三ソートキー 昇順 以下を試して見ましたがうまくいきませんでした。 sort -k 1.1,1.2 -r -k 1.4,1.6 -k 1.8,1.9 test.txt

  • Sortコマンド以外で行をソートする方法

    Sortコマンドを使ってテキストファイル内の行をソートしていたのですが、扱うテキストファイルの内容によってエラーが出てしまい、エラーメッセージをWEBで検索して書かれていた対策をしたのですがうまく行きませんでした。 ですので、Sort以外のコマンドで、テキストファイル内の行を昇順と降順でソートしたいと考えているのですが、何か方法はないでしょうか。 Windowsのコマンドプロンプトで使用出来るものであれば、AWKでもPerlでもその他のコマンドでも構いませんし、スクリプトファイルを読み込めるコマンドでしたらスクリプトでの書き方でも結構ですので、ご存知の方がおられましたら教えて頂けないでしょうか。

  • UNIX コマンドへの引数について

    二つのテキストファイル、file1 と file2 の内容を UNIX のコマンドで比較しようとしています。 file1 と file2 は非常にサイズが大きく(2 - 3GB程度)、またソートされていない状態で、それぞれレコード順はバラバラです。 この二つのファイルの差分レコードを中間ファイルを作らずに抽出する事を考えております。 そこで comm コマンドの実行を検討しているのですが、 未ソートデータの為、二つのファイルのsort 結果を comm コマンドに 引き渡そうとしていますが、その方法が分からず困っています。 ご教示頂けると大変助かります。 また、comm コマンドを利用する以外の方法でより高速に実行可能な方法が有りましたら併せてご教示頂けると幸いです。 以上、宜しくお願い致します。

  • ノートPC 最大メモリー容量オーバーでの使用可能でしょうか?

    ノートPC 最大メモリー容量 オーバーでの使用可能でしょうか? 使用パソコン Dell INSPIRON5100 カタログ上:最大搭載メモリー 1GB 質問内容 ・現在メモリー1GBを 使用しておりますが、 メモリー1GB×2枚(2GB)を 取り付けた場合、2GBの動きするでしょうか?

  • bash forコマンドでソート

    bash forコマンドでソート CentOS8 bashの forコマンドで、ディレクトリ内のファイル名を部分指定した降順でソートした状態で順次読み込みしたいです。 <ファイル> aaa.dat bbbb_0001.dat TEST_0001.file TEST_0002.file TEST_0003.file <アウトプット> TEST_0003.file TEST_0002.file TEST_0001.file 基本的な読込と、lsコマンドの結果を基に読み込む方法はわかりましたが、これに降順ソートを加えるにはどうすれば良いでしょうか? <基本的な読込> for file in /dir1/TEST_*.file do echo $file done <lsコマンドの結果を基に読込> for file in $(ls /dir1/TEST_*.file) do echo $file done

  • DOSのdirコマンドで思うようにソートされません。

    DOSコマンドで、フォルダ内のファイルリストを作成しようとしているのですが、思うようにソートされずに困っています。 たとえば、image.1.jpg,image.2.jpg,・・・・・image.10.jpg があったときに、"dir /b image.*.jpg > list" とすると、listファイル内では、 image.1.jpg image.10.jpg image.2.jpg image.3.jpg のような順番になってしまいます。 理想的には、以下のようになってほしいのですが。 image.1.jpg image.2.jpg image.3.jpg ・・・・ image.10.jpg UNIXコマンドの場合、"ls image.?.jpg > list", "ls image.??.jpg >> list" 以上のように処理することで、目的を達成できるのですが、 DOS環境で、以上の問題を解決する方法をどなたか教えてください。 宜しくお願いします<(_ _)>

  • オーバークロック用メモリーの選定

    オーバークロックを考えています CPU:Pentium DualCore E2160 マザー:GIGABYTE製GA-G31M-S2L OS:XP SP2の予定です メモリーの選定を考えています、現段階ではTWIN2X2048-6400C4 1GB*2 CL4  http://www.ark-pc.co.jp/item/TWIN2X2048-6400C4+XMS2-6400+1GB%252A2+CL4/code/11750505/を購入してはと思っていますがこのメモリーに付いてのご意見をお願いします。 パソコンのスキルは自作が今回を含めて2回目です、OCは自己責任を承知した上で勉強の意味でトライします。限界までのOCを考えている訳では無く1.8GHZ⇒2.5MHZ程度で考えています。 もう一点URL先にOCメモリーに付いての注意書きがあり”使用環境とメモリの組み合わせやオーバークロックメモリのリスクを十分ご検討の上、購入されるようお願い申し上げます”とあり気になっています。 (1)このメモリー選択に対する意見 (2)他メーカーでお勧めのメモリーがあれば紹介をお願い致します。