2016-04-29 18 views
1

多くの文字列のファイルがあるとします。文字列を辞書順に並べる方法は?可変長の文章の大きなファイルをソートする方法は?

詳細:

  • ファイルサイズが約32ギガバイト ytesです。
  • 各行はスペースで区切られた可変数の単語を含む1つの文とみなすことができます。つまり、各行の長さは固定されません。
  • 各単語にはASCII文字のみが含まれています。
  • 私はただ持っています8 GBメモリのytesしかし無限のディスクスペース。

私が知ることができるのは、外部マージソートです。この特定の問題の良いアイデアはありますか?

+0

外部マージソートは、かなり良いオプションのように聞こえます。最初の文字に応じてファイルを分割することも考えてみましょう。まず分割ヒストグラムを作成し、結果の各サブファイルをソートして連結します。 (実際には、サブファイルを作成するか、大きな32GBファイルを別々に通過させてそれぞれを生成してもよいでしょう) –

+0

' outfile'よりもうまくいくのは難しいでしょう。 GNU 'sort'(Windows版も可能)は、必要に応じて効率的なマルチパスマージを使って、メモリよりはるかに大きなファイルを自動的に処理します。 –

答えて

2

ファイルサイズとメモリの違いはそれほど大きくはないので、最初の文字に基づいてファイルを分割するか、最初の2文字で十分でない場合はファイルを分割することをお勧めします。

次に、クイックソートでそれぞれをソートして保存し、並べ替えた後に並べ替えることができます。

それでもO(N)I/O操作とO(n * log(N))CPU操作があります。

PS:外部マージソートも良い方法です。

+0

ありがとうございます。スプリットの仕組みを詳しく説明できますか?私たちは可変長の行を持っているので、文字によるハッシングがオーバーフローにつながるかもしれないと思います。たとえば、文字 'aa'で始まる行の数が10%で、完全にスペースの50%を占めているとします(非常に長い「a blabla bla bla ...」文)。 – idailylife

+0

@ idailylife - これは起こり得るが、それは非常に起こりそうもない。ワンタイムインポートを行っている場合は、試してみることもできますし、メモリに足りない場合は問題ありません。それが落ちると、行動を変えることができます。一般的な解決法が必要な場合は、大きすぎるファイルを複数のプレフィックス文字に分割することができます(読み込む前に各ファイルのサイズが表示されます)。 – libik

関連する問題