巨大なファイルに対する「sort -u」のスケーラビリティ


23

「sort -u」の合理的なスケーラビリティ制限とは何ですか?(「行の長さ」、「行の量」、「ファイルの合計サイズ」の次元で?)

「行数」の次元でこれを超えるファイルに対するUnixの代替手段は何ですか?(もちろん、1つを簡単に実装できますが、標準のLinuxコマンドをほとんど使用せずにできることはあるのでしょうか?)


その中でバイナリ検索をしたい、またはその方法を知りたい人のために:unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
uniq前にsort -u役立つ状況があります。ところで、ASCIIデータはLC_ALL=C sortGNU sortを非常に高速化します(この回答を参照)
Walter Tross

回答:


39

sortあなたがLinux上で見つけることがから来ているのcoreutilsのパッケージと実装外部R-ウェイマージ。データをメモリに処理できるチャンクに分割し、ディスクに保存してからマージします。マシンにプロセッサが搭載されている場合、チャンクは並行して実行されます。

そのため、制限がある場合は、sortマージする必要がある一時ファイルを保存するために使用できる空きディスク領域が、結果と組み合わされます。


3
GNUソートでは、これらの一時ファイルを圧縮してさらに圧縮することができることに注意してください(遅いディスクでパフォーマンスを向上させる)。
ステファンシャゼル16

1
@StéphaneChazelasアップデートをありがとう。スペースの最適化として、ソートが完全にマージされたときにチャンクファイルを削除するのに十分なソートであるかどうかを疑問に思っていました(ソースがすでに部分的にソートされている場合は簡単に起こります)。私は最近ソースコードに飛び込む時間を持っていません:
Anthon

3
メモリとは別に、マージフェーズに適用される別の制限もあります。同時に開くことができるファイルの数です。これは通常、オペレーティングシステムによって課される制限です。GNUソートは、一度に開くことができるファイルの数を再帰的にマージすることにより、同様に対処します!
ディオミディススピネリス

@StéphaneChazelas非常に大きなファイルを並べ替えるためのツールを特別に設計している場合、行をインデックスとして元のファイルに保存します。GNUソートはこれを行いますか、それとも従来の圧縮アルゴリズムを単に使用しますか?
Random832

3
Random832 @それ自体の上にファイルを上書きすることがあることを意味しています(sort -o file file
ステファンChazelas

1

ベンダー固有の実装について話すことはできませんが、UNIX sort実装は大きなファイルを小さなファイルに分割し、これらのファイルをソートしてから、ソートされた小さなファイルを集約ソート出力に結合します。

唯一の制限は、によって中間的に作成された小さいファイルのディスク容量sortですが、環境変数を設定することにより、ファイルを任意のディレクトリにリダイレクトできますTMPDIR


3
UNIXのソートの実装を正確に何と呼び ますか?Unixバージョン3からのオリジナルですか?そこのmanページには、128KiBより大きいファイルをソートできないと書かれています。
ステファンシャゼラス16

Unixバージョン3では何を理解していますか?1973年からのバージョンですか?オリジナルのUNIXソートの実装は長年にわたって強化されてきており、IIRC、SolarisバージョンはGNUバージョンよりもさらに高速です。もちろん、25年前にマルチバイト文字を理解するためにソートが強化されました。USENETの議論から覚えていることは、これはSolarisで効率的に行われたことです。ところで:大規模ファイル対応としてman largefileリストsortします。
schily

2
では、実際にOracleベンダー固有のバージョンについて話しているのsortですか?または、AT&T Unixソートのバージョンの派生物はありますか?または、Unix認定バージョンsortsortOS / X上のGNUなど)
ステファンシャゼラス16

sortマルチバイト文字に関する最新の実装の品質は異なる場合があります。sort分割された中間ファイルを使用するという事実は、元のコードに基づくすべてのUNIX実装に共通です。ところで:Solarisバージョンは、「OpenSolarisの」などのOSSで、参照sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/...
シリー

25年前、UTF-8はまだ発明されていませんか?UTF-8ロケールのサポートは、Solaris 7(添加した12)。他のマルチバイト文字セットを参照していますか?
ステファンシャゼラス16

1

https://blog.mafr.de/2010/05/23/sorting-large-files/および/unix//a/88704/9689に基づく:

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

更新:

上記の回答から、sortスニペットに言及したこと、つまり外部R-Wayマージが既に行われていることがわかります。したがって、すべて実行した後:

sort --parallel="$(nproc --all)" -u input > output

十分なはずです。

制限に関する私の現在の仮定(コードをチェックせず)は次のとおりです。

  • 最大行長は、物理メモリの量によって制限されます。ソートは少なくとも2つをメモリに収める必要があります
  • 行の量-私は知らない
  • ファイルサイズ-もちろんファイルシステム別
  • 並行して開かれたファイルの量-オペレーティングシステムに依存します(これを指摘してくれたDiomidis Spinellisに感謝します!)

(この回答はコミュニティwikiとしてマークされています -それを改善することをお勧めし!:))


2
GNUはsortデフォルトで並行してソートします(リンクしているページの2010年以降)ので、最適な--parallelスレッドをsort決定するのではなく、並行スレッドの数を減らす必要があります。ソートはすでに、より効率的な方法で内部的に分割とマージを行っています。余分な分割が役立つとは思えません。
ステファンシャゼラス16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.