sortコマンドで大容量のファイルをソートする方法について

このQ&Aのポイント
  • sortコマンドによる大容量ファイルのソートで「sort:0653-657ソート中に書込みエラーが発生しました。」というエラーが出る場合、/usr/tmpディレクトリのファイルシステムの容量不足が原因と考えられます。
  • ソート時には一時ディレクトリとして/usr/tmpディレクトリが使用され、ソート結果を一時的に保存します。ファイルシステムの容量が不足している場合、ソートが失敗します。
  • ファイルシステムの容量を拡張することができない場合、代替方法としてソート処理を分割する方法があります。例えば、ファイルを複数の部分ファイルに分割して個々の部分ファイルをソートし、最後に結合するという手順です。
回答を見る
  • ベストアンサー

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ディレクトリのファイルシステムの拡張を求めたところ「できない」と言われてしまいました。 開発の最終段階でのボリュームテストを行ったときの障害でしたので、 処理を大幅に変更するような対処は出来ない状況です。 代替方法などありましたらご教示頂きたいと思います。 以上、宜しくお願い致します。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.2

man sort に載ってますが、-T オプションでワークディレクトリを別の場所に指定できます。 そもそもどこにも必要容量のワークを確保できない場合は、対象ファイルを小さく分割して、それぞれソートし、出来た分割ソート済みファイルを sort -m でマージするといいです。sort -m だとワークを使いませんので。

tanamochi
質問者

お礼

ご回答有難うございました。 man sortを確認出来ていませんでした。 -T オプションを用いワークディレクトリを指定したところ、 正常に動作致しました。 また、ファイルシステム的に大きなディレクトリをいつまで確保できるかわかりませんので、 稼動後、sort -m についても検討してみようと思います。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

ウチの環境は FreeBSD ですが man sort すると -T --temporary-directory=DIR use DIR for temporaries, not $TMPDIR or /tmp; multiple options specify multiple directories とあります。 /usr/tmp 以外で空いているディレクトリがあれば、 そこを指定してみてはどうでしょうか?

tanamochi
質問者

お礼

ご回答有難うございます。 -T オプションに指定してもよいというディレクトリを提供して頂けたので、 解決することが出来ました。 80Mbyteのファイルをソートするのにこんなに多くの容量を必要とするとは思ってもいませんでした; 大変参考になりました。

関連するQ&A

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

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

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

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

  • ファイルの結合

    UNIX上で下記のようなfileA、fileBから fileA aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 fileB aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 下記のようなfileCを作ろうとしています。 fileC aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 aaa,ddd,999 そこで、以下のように一列目と2列目をキーにして、sortすることにしました。 cat fileA fileB | sort -u -k1,2 -t, > fileC すると、fileCは下記のようになりました。(一行目の3列目が222ではなく、111になってしまいました) fileC aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 キー項目以外はfileAを優先させたいのですが、なにか良い方法はないでしょうか?

  • シェルスクリプト ファイルパス違いによって実行結果が違う 比較

    シェルスクリプト(bシェル)を作成しています。fileA.txtの中身を一行ずつ読み込んで、fileB.txtと比較を行うプログラム(sample.sh)です。 設定しているファイルのパスの違いによって実行が出来るものと出来ないものがあり、その原因がわかりません。 【1】自分のホームディレクトリ(MyDIR)にすべてのファイルを置いている FILEA=/home/MyDIR/TEST/fileA.txt FILEB=/home/MyDIR/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  このプログラムは正常に実行できます 【2】FILEA,Bを/tmpの下に作ったTESTディレクトリの下に置いている sample.shは/home/MyDIR/TESTの下、fileA,Bは/tmp/TESTの下。 set FILEA=/tmp/TEST/fileA.txt set FILEB=/tmp/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  ファイルのパスをこのように変更すると、while:構文が間違っています。というエラーが出て実行できません。whileの中に入れていないようです。スペルミスはありませんし、パスが違うだけでなぜ実行が出来なくなるのでしょうか? よろしくお願いします。

  • sortコマンドについて

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

  • treeコマンドでソートできませんか?

     コマンドプロンプトのtreeコマンドで、ディレクトリ名順、ファイル順にソートして出力することはできますか?  “| sort”を使ってみましたが、どうもうまくできませんでしたので。よろしくお願いします。

  • sortコマンドのオプションなどの意味

    シェルスクリプトに次のようなsortコマンドが出てきました。 sort -t, /export/home1/aaa -u -k 1 -o $CSV_OUTFILE/$OUTPUT_FILE \     $CSV_OUTFILE/$INPUT_FILE_AAA $CSV_OUTFILE/$INPUT_FILE_BBB (aaaとAAAとBBBは変えていますが、あとはまったくもとのままです。) 行の最後の\は行継続の意味でよろしいでしょうか。 -t の直後に "," (カンマ) がありますが、これは「(空白区切りではなくて)カンマ区切り」という意味でよろしいですか。 (-tとカンマの間に空白は要らないのでしょうか。カンマはシングルクォーテーションで囲まなくてよいのでしょうか。) /export/home1/aaa というディレクトリの指定がありますが、これはなんのためでしょうか。 -u は同一行は重ねて出力しないという意味でよろしいでしょうか。 (キーが同じ行は重ねて出力しないという意味ではないですよね?) -k 1 の意味がわかりません。(ソートするキーの指定?) インプットファイルの指定と思われるものが2つありますが、入力ファイルは複数でも構わないのでしょうか? 以上ですが、わかるものだけでも結構です。 よろしくお願いします。

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

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

  • 「*」記号が1ファイルしか展開しない

    「*」記号はシングルクオテーションをつけるかつけないかで展開するファイル数が変わってくるのでしょうか? カレントディレクトリにfileAとfileBがある状態 find . *ile*  →エラー find . '*ile*'  →fileA, fileBが見つかる カレントディレクトリにfileAのみ状態 find . *ile*  →fileAが見つかる find . '*ile*'  →fileAが見つかる 上記動作の仕組みが良くわかりません。 識者の方、解説をお願いします。

  • CSVの5行づつを比較しながら書き込みたい

    CSVファイルを取り込み、さまざまなゴミを除去した後、 新たなCSVファイルへ書き込むという所まではできたのですが、行きづまっております…。 このCSVファイルは、アクセス時間、ファイル名、IPアドレス、の3列になっていまして、例えばですが 12:00:00,fileA,255.255.255.0 12:00:01,fileA,255.255.255.0 12:00:10,fileA,255.255.255.0 12:10:10,fileB,255.255.255.255 12:10:15,fileB,255.255.255.255 のようになっています。 上記のトップ3行のように、数秒以内に同じ人が同じファイルにアクセスしたという 状況はゴミとして除去したいのですが、最初のアクセスだけは正規のアクセスとして生かしたいのです。 こういった前後5行ほどを比較し、時間が近ければ除去しつつ、新たなCSVへ書き込むという 方法はどのように行ったら宜しいのでしょうか? どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP