2016-08-10 5 views
6

現在、500GBのテキストファイルのUNIXソート(WindowsマシンのGitBash経由)を行っています。メインディスク上の空き領域がなくなるため、-Tオプションを使用して一時ファイルを、ファイル全体を格納するのに十分な領域があるディスクに転送しています。事は、私はディスクスペースを見ていて、明らかに一時ファイルは元のファイルのものをすでに超えています。どれくらい先に行くのか分かりませんが、一時ファイルにどれくらいのスペースが必要かを予測できるルールがあるかどうかは疑問です。UNIXソートに必要なディスク容量

+2

UNIXソートがGNUソートに類似している場合、初期パスはRAMサイズに基づいて一時ファイルを作成します。メモリにソートするために使用できる1GBのRAMがあると仮定すると、500GBのファイルが作成され、次にそれらのファイルに16ウェイのマージが繰り返されます。また、各マージ後にファイルを削除すると仮定すると、各ファイルはクラスタ(ファイル割り当て)サイズの境界に丸められた516ギガバイトのスペースが必要になります。最後のマージでは、必要なディスク容量はファイルサイズの2倍になります(クラスタボンダリに切り上げられます)。 – rcgldr

+0

ラット!私はいくつかのストレージに投資しなければならないようです。 – Thoughtcraft

+0

その最後のマージは一時フォルダにもありますか? 1つのディスクに2つのファイルの完全なコピーを作成することを避けるために、出力をtempとは別の場所に指示しました。 – Thoughtcraft

答えて

0

this unix.SE answerで説明されているように手動でバッチします。

ソートするのに十分小さいチャンクにコンテンツを分割する非常に基本的なクエリを見つけます。たとえば、単語のファイルの場合は、grep ^a …,grep ^b …などのようなクエリを作成できます。一部の項目は、他の項目より細分性が必要な場合があります。それはgzipでのデフォルトgzip -6とほぼ同じ速さですので、私はxz -0を使用してい

#!/bin/bash 
for char1 in other {0..9} {a..z}; do 
    out="/tmp/sort.$char1.xz" 
    echo "Extracting lines starting with '$char1'" 
    if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi 
    grep -i "^$char1" *.txt |xz -c0 > "$out" 
    unxz -c "$out" |sort -u >> output.txt || exit 1 
    rm "$out" 
done 
echo "It worked" 

まだそれはスペースを節約で非常に良いでしょう:

あなたがスクリプト好きなことができます。終了値sort -uを保存するために最終出力から省略しましたが、代わりにサイズチェック(iirc、出力がゼロで失敗する)を使用してsort -u |xz -c0 >> output.txt.xzを使用すると、xz(およびgzip)コンテナによってアーカイブを連結できます(私も前にwritten about thatでした)。

各grepの実行の出力がすでにソートされているので、これは(0aなどの前にある、1の前で)動作しますが、最終的な組み立てがsort(ノート、「その他」を介して実行する必要はありません。 grepの-iフラグを削除し、さらに{A..Z}を繰り返して大文字と小文字を区別することもできます)。個々の反復はまだソートされている必要がありますが、うまくいけば管理可能です。

すべての反復を完了して「それが働いた」と言う前にプログラムが終了した場合、試した最後の反復に対してより離散したバッチでスクリプトを編集できます。以前のすべての反復は、output.txtに正常に保存されているので、すべて削除してください。

関連する問題