2016-05-26 4 views
0

メモリに入りきらないサイズのファイルをソートしようとしています。オプション-mのgnuソートの人は、merge already sorted files; do not sortと言っています。私はソートが私が望んでいるものを達成することを確実にするために、これの意味を理解するのに苦労しています。この記事(Sorting in pandas for large datasets)は、gnu splitとgnu sortの組み合わせを提案します。このようなタスクを達成するには、最初にファイルをメモリに収められた小さな部分に分割し、それぞれを個別にソートしてから再結合します。これまでの私の実験は、この手順が実際に機能することを示しているようです。それにもかかわらず、マニュアルではソートされていないというマージオプションの説明には悩まされています。私の目的のために、大きなファイルは、ローカルでソートされた小さな部分の連結だけでなく、完全にソートする必要があります。私は小さな例で手順をテストしたが、うまくいくように見えますが、gnuの検証ができなくなった場合に予期しない動作が発生する可能性があるので、ソートは私が意図したとおりに機能しました。 MWEを与えることgnu-sort - マージオプションが「ソートしない」と言ったときのマニュアルの意味

、私は並べ替えしたいと思い、このタブ区切りファイルを検討:

3 4 
2 5 
3 1 
1 3 

を私は、次の操作を試してみました:

SortDir="/Users/aireties/Desktop/Sort_Experiments" 
## sort document as a whole (in practice, this would be infeasible due to document size) 
sort --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/To_Be_Sorted.txt" -o "$SortDir/Sorted_as_Whole.txt" ## sort first by the first column values, then by the second 

1 3 
2 5 
3 1 
3 4 

これが「正しい」解決策であるソートするときファイル全体を一度に(私の実際のユースケースでは実行不可能なもの)。

私は粉々にファイルを分割しようとした後、すぐに-mオプションを使用している場合、私は間違った結果が得られます。

## Break file into pieces 
MaxLines=2 
mkdir "$SortDir/Pieces/" 
split -l $MaxLines "$SortDir/To_Be_Sorted.txt" "$SortDir/Pieces/" 
## Try merge sort on pieces without first sorting them 
sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces1.txt" 

3 1 
1 3 
3 4 
2 5 

何が表示されたことが起こったのは、GNUソートがちょうど2つ考えられているということです別々の小片を作り、互いの最初の値に関してそれらをソートした。したがって、この完成品には2番目の作品が最初に置かれましたが、他のソートは行われていません。最初のピースを並べ替えた後、マージすることである

代わりに私が続く場合は、手順はこちら(Sorting in pandas for large datasets)を提唱し、私は正しい結果を得るように見えるん:スティッキングポイント、私にとって

for file in "$SortDir/Pieces/"* ## sorts all text files in pwd 
do 
    sort --field-separator=$'\t' -k 1,1 -k 2,2 "$file" -o "$file" 
done  

sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces2.txt"  

1 3 
2 5 
3 1 
3 4 


cmp --silent "$SortDir/Sorted_in_Pieces1.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different" 
# file are different 
cmp --silent "$SortDir/Sorted_in_Pieces2.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different" 

は、ピースファイルが大きい場合、適切にソートされた単一のファイルにそれらをマージするために実行する必要がある計算がまだかなり残っているということです。したがって、私は、それほど些細な量の仕分けが「分類しない」と主張する操作の結果としてどのように記述されるかについて、私の心を包み込むことは難しいと思う。

誰かが、マニュアルがそのように表現される理由について私に教えてもらえますか? gnu sortは、マージオプションを使用するときに、確実に何を主張するのか、なぜ、どのようにすればよいでしょうか?マニュアルのテキストは、何らかの形で、この手順では望みの結果が得られない場合があることを示唆していますか?

答えて

1

ヌーのソート(私はのためのソースコードを見て、少なくともバージョン)、メモリ内のファイルのチャンクをソートし、一時ファイルのセットを作成します(1チャンクごとの一時ファイル)。また、メモリソートフェーズでマルチスレッドを使用します(コマンドラインパラメータは、使用するスレッドの最大数を設定できます)。すべての一時ファイルが作成された後、1つのソートされたファイルが生成されるまで、一時ファイルの16通りのマージ(これをオーバーライドしない限り)を行います。

gnu sortは大きなファイルを自動的に処理し、必要に応じてソートされた1つのファイルにマージするためにソートされた一時ファイルを作成するため、ファイルを別々のファイルに分割する必要はありません。

-mオプションは、複数が既にファイルがマージされるソートの特別な場合です。

0

は、単にmergesortの操作mergeのように、ファイルをまとめてマージします。 2つのファイルを同じ順序でソートする必要があります。

非常に大きなファイルをソートするには、実際に何をしているのか、いくつかの小さなファイルに分割してローカルに並べ替えます。この時点で、各ファイルを別のファイルに追加するだけでは、0 1 2 3 ... 0 1 2 3

-mオプションを適切にマージするようになります。それらと例えば

、:

a b 
1 3 
2 2 
3 1 

sort -m a b 
# 1 2 3 3 2 1 
sort -m a a 
# 1 1 2 2 3 3 
sort -m b b 
# 3 2 1 3 2 1 
sort -r -m b a 
# 3 2 1 1 2 3 
関連する問題