2017-02-06 11 views
-2

各フォルダに最大20個のファイルがある200個のフォルダがあります。データセットの合計は2GBです。私は一度にすべてを解析し、各行をリストに入れて並べ替えてみましたが、メモリが足りなくなりました。複数のファイルを1つのファイルに並べ替える

複数のファイルを1つのファイルにソートするにはどうすればよいですか?

+0

最も簡単な解決策は、ヒープサイズにメモリを追加してください。 8 GBはそれほど多くありません。私の9歳には24 GBの古いマシンがあります。 –

+0

XML?ジェイソン?プレーンテキスト? – efekctive

+0

その平らなテキスト – sweep

答えて

1

ファイルベースmerge-sort:各ファイルの

  1. ソート内容。
  2. 各フォルダの20個のファイルをマージして、フォルダごとに1つのソート済みファイルを取得します。
  3. 最終結果を得るために、200のフォルダファイルをマージします。

200ウェイマージソートを実行したくない場合は、#3を複数のマージソートに分割し、それらの結果を必要なだけ多くのレベルにマージソートできます。

+0

手順2と3はマージソートではなく、マージするだけであることに注意してください。具体的には、[k-way merge](https://en.wikipedia.org/wiki/K-Way_Merge_Algorithms)。そして、実際には、あなたのコードが20通りのマージを行うことができれば、それは200通りのマージを行うことができます。ある時点では、バッファのメモリが不足しますが、200ではなくなります。 –

+0

@ JimMischelマージソートが2ウェイマージに限定されるという要件はないと思いますが、それは通常そうです。 2つ(またはそれ以上)のソートされたサブセットをマージして、より大きなソートされたサブセットをプロダクト化し、すべてのデータがソートされるまでそのプロセスを繰り返すというコンセプト。私はステップ2がマージソートだと決して言わなかった。私はシーケンス全体(1-3)がディスクベースのマルチウェイマージソートだと言っていました。もちろん、ステップ1はメモリ内で実行可能で、ソートアルゴリズムはすべて使用できますが、全体のコンセプトはマージソートです。 – Andreas

+0

あなたは私のコメントを誤解しました。私は単純に、ステップ2とステップ3は技術的に分類されているわけではなく、単にマージすると言っていました。だから、 "Merge sort 20 files ..."という言葉は、 "Merge the 20 files ..."と言うのが正しいです。マージに関しては、2ウェイマージを行うことは一度も言及していません。それはひどく非効率的です。この場合、最も効率的なのは、個々のファイルをソートした後に4000通りのマージを行うことです。それはI/O時間を最小限に抑えるでしょう。しかし、スピードが最優先事項でない場合は、推奨するように分割することは実用的です。 –

0

どのソートアルゴリズムを使用していますか?私は問題がアルゴリズムにあると思うので、ソートを行うためのより効率的なアルゴリズムを検討する必要があります。大きな入力の場合は、Merge-Sortが最適です(ただし、そのサイズにはいくつかの変更が加えられています)。

Hereは、非常によく似た質問です。上の2つの回答を見てください。彼らはあなたが問題を解決するのを助けるべきです。

関連する問題