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では十分ではありません。