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

大きなファイルをソートすると、分割エラーが発生します。
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 *部分の前後の複数の部分に分割されます。少し見苦しいですが、動作するはずです。保存するには、必要な順序を書き留めます。

おすすめ記事