大きなファイルをソートすると、分割エラーが発生します。

大きなファイルをソートすると、分割エラーが発生します。
mkdir tmp
sort -u *.txt -T tmp/ -o output.txt

数十ギガバイトのファイルをソートするだけです。

問題は、数分後にソートが分割されることです。

オペレーティングシステムは最新のScientific Linux 6.6です。

質問:ファイルを「ソート -u」する方法は? Sortはより大きなファイルを処理できませんか? ..セグフォルトが発生したとき、RAMが半分も満たされませんでした。

答え1

過去には大きすぎるファイルを並べ替える必要がありましたsort。私の考えでは、これはあなたの問題でもありますが、より多くの情報を提供してください。あなたの問題をよりよく診断することができます。

grep私の問題に対する解決策は、プリプロセッサを使用してファイルを分割することです。データを見て、塊がどこにあるかを確認してください。英数字空間によく分散していると仮定しますが、後でクラスタを処理する方法について説明します。

for char1 in other {0..9} {a..z}; do
  out="/tmp/sort.$char1"
  echo "Extracting lines starting with '$char1'"
  if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi
  grep -i "^$char1" *.txt > "$out"
  sort -u "$out" >> output.txt || break
done

(これはbashismを使用します。これを防ぐには、37文字のそれぞれに明示的に名前を付けます。たとえばfor char1 in other 0 1 2 3 4 5 6 7 8 9 0 a b c d e f ...

塊:これらのループ呼び出しの中には、sortデータが多すぎてセグフォルトが発生する可能性があります。繰り返しを修正していくつかの部分に分けてください。これはgrepからフラグを削除し、各大文字を呼び出すのと同じくらい簡単かもしれませんし-i(に変更することを忘れないでくださいother)、[^a-zA-Z0-9]データをより深く掘り下げる必要があります。これがパッケージリストの場合、「lib」で始まる行が多すぎて繰り返しが/tmp/sort.l失敗する可能性があります。|| breakこのループの一部はこの時点で処理を停止するため、問題を修正して中断した部分から続行できます。 「lib」の例に続いて、次のように続行できます。

for char1 in 'l[a-h]' 'lia' lib{a..z} lib{0..9} 'li[c-z]' 'l[j-z]' {m..z}; do
  ...

これにより、lリストはlib *部分の前後の複数の部分に分割されます。少し見苦しいですが、動作するはずです。保存するには、必要な順序を書き留めます。

答え2

もう1つの可能性は、各ファイルを個別にソートしてマージすることです。

for f in *txt; do
    sort -u "$f" -T tmp/ > "$f".sorted
done
sort -mu *sorted

この-mオプションは、sortソートされたファイルをソートする代わりにマージします。これにより、メモリ使用量が大幅に削減され、セグフォルトを防ぐことができます。

答え3

さまざまな回答の組み合わせ:ファイルを複数の部分に並べ替えるには、分割を試してください。

LARGETMP=/var/tmp
mkdir ${LARGETMP}
N_LINES=100000 # Adjust when to still too large or too small
split --lines=${N_LINES} bigfile splitted_
for small in splitted*; do
   sort -u -T ${LARGETMP} ${small} > sorted_${small}
   rm ${small}
done
echo "Done with sorting the splitted files, now concate the stuff"
sort -um -T ${LARGETMP} sorted_* > bigfile.sorted

編集:@ua2bが述べたように、サイズ別に分割すると、ほとんどの行の途中で分割されます。
(ファイルに改行文字がないと、ソートという全体的なアイデアが少し変になります。)

答え4

OpenBSDでメソッドを見つけました。

http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/sort.1?query=sort&sec=1

 -H
    Use a merge sort instead of a radix sort. This option should be used for files larger than 60MB.

しかし、これはあまりにも多くのスペースを占めているので、完全に良い解決策ではありません。 x> 100 GByteでは十分ではありません。

関連情報