少なくともタイトル検索からは、これに関する既存の質問はないようです。外部マージに最適なパス数を見つけようとしています。したがって、1000チャンクのデータがある場合、1回のパスは1000ウェイのマージになります。2つのパスは、200チャンクの5つのグループであり、5つのチャンクの1つのグループの最終的なマージです。等々。2つのパスが1つのパスに勝るものはないように見えるので、私はいくつかの計算を行いましたが、これには欠陥があるはずです。ただし、データの読み取り方法については誤解である可能性があります。
まず、数値例:
データ:100 GB RAM
:1 GB
1GBのメモリがあるため、一度に1GBをロードして、クイックソートまたはマージソートを使用して並べ替えることができます。これで、100個のチャンクを並べ替えることができます。100ウェイマージを実行できます。これは、RAM/(chunks+1)
サイズバケット==1024MB/101
を作成することによって行われ10.14MB
ます。10.14MB
100個のチャンクごとに100個のバケットがあり、サイズも1つの出力バケットがあります10.14MB
。マージするときに、入力バケットが空の場合、ディスクシークを実行してそのバケットを補充します。同様に、出力バケットがいっぱいになると、ディスクに書き込んで空にします。「ディスクが読み取る必要がある回数」は(data/ram)*(chunks+1)
です。これは、入力バケットのサイズを設定しているという事実から得ram/(chunks+1)
られます。特定のパスのデータ全体を読み込む必要があるため、次のように読みます。(data/bucket_size)
回数。つまり、入力バケットが空になるたびに、それを補充する必要があります。ここでは100を超えるチャンクを実行するため、numChunks*(chunk_size/bucket_size)
=datasize/bucket_size
または100*(1024MB/10.14MB)
。BucketSize = ram/(chunks+1)
so 100*(1024/10.14)
= (data/ram) * (chunks+1)
== 1024*100MB/1024MB * 101
10100読み取り。
2パスシステムの場合、B #chunksのAグループを実行し、次にA#chunksの1グループの最終マージを実行します。前のロジックを使用すると、numReads=になりA*( (data/ram)*(B+1)) + 1*( (data/ram)*(A+1))
ます。A*B
=もありますData/Ram
。たとえば、10個のチャンクからなる10個のグループで、各チャンクはGBです。ここで、A = 10 B = 10. 10 * 10 = 100/1 = 100、つまりData/Ram
。これはData/Ram
、元のチャンクの数であったためです。2パスの場合、Data/Ram
B#チャンクのAグループに分割します。
ここで式を分解してみます。D=データ、A =#グループ、B =#チャンク/グループ、R=RAMとします。
A*(D/R)*(B+1) + 1*(D/R)*(A+1)
-これは、B#chunksでの外部マージの読み取り数とA#chunksでの最終マージのA倍です。
A = D/(R*B) => D^2/(B*R^2) * (B+1) + D/R * (D/(R*B)+1)
(D^2/R^2)*[1 + 2/B] + D/R
2パス外部マージの読み取り数です。1パスの場合、1パスの(data/ram)*(chunks+1)
チャンク=データ/RAMです。したがって、1つのパスに対してD^2/R^2 + D/R
。チャンクサイズBが無限大になると、2パスがそれに達するだけであり、それでも追加の最終マージによってが得られD^2/R^2 + D/R
ます。ですから、私が見逃している読み取りについて何かがあるに違いありません。さもないと、私の数学に欠陥があります。私を助けるために時間を割いてくれた人に感謝します!