2013-04-26 9 views
5

私はcsvファイルから情報を読み込むことを含む単純なJavaアプリケーションを構築しています。 csvファイル内の情報は、このフォームで来る:2つの大きなテキストファイルをJavaでソートする最良の方法は何ですか?

"ID","Description" 
"AB","Some sort of information for AB" 
"AC","Some sort of information for AC" 

私は、ユーザーがIDでソートコンソールでは、説明、ID、またはその両方をプリントアウトできるように必要なのです。最も簡単な解決策は、ファイルをopencsvなどのCSVライブラリで解析し、これらの文字列をTreeMapに入れて、TreeMapの内容を出力することです。 TreeMapのキーはIDになり、値は説明になります。

しかし、CSVファイルが巨大になる可能性があります。これは5 GBで、5 GBの文字列をTreeMapにロードすると、メモリ不足のエラーが発生します。大きなファイルを処理するには、外部のマージソートを使用してファイルをソートできます。いったんソートされたファイルを取得すると、単にファイルを読むだけで、ファイルの内容をコンソールに出力できます。

外部マージソートは、ファイルの内容をTreeMapにロードするよりもずっと遅くなります。私はファイルサイズを検出することを検討しています。ファイルサイズが使用可能なメモリを超えている場合は、外部のマージソートを使用します。それ以外の場合は、ファイルの内容をTreeMapにロードします。

しかし、これは、2つの異なるソートを実行する2つの別々のコードブロックが存在することを意味します。したがって、維持する必要があるコードの量を増やしてください。このアプリケーションを書くなら、小さなcsvファイルと大きなcsvファイルを扱う2つの分離コードコードを書くことを検討しますか?または、ファイルのサイズにかかわらず外部マージソートを使用してファイルを並べ替えるだけですか?

この方法に代わる方法はありますか?

ありがとうございます。

+1

これは議論と複数の有効な提案につながるかもしれない設計上の質問です。 http://programmers.stackexchange.comの方が適しているかもしれません。私はここで "建設的ではない"と票決しました。 –

+0

@DuncanJonesこんにちは、私はこれをプログラマに移行して嬉しく思います.stackexchange.com。一度私はそれを行う方法を見つけた – zfranciscus

+0

@DuncanJones私はスタックオーバフローで824の評判を持っていますが、私はプログラマ.stackexchange.comで113の評判しか持っていません。これが私がプログラマーにこの質問を移行することができない理由です.stackexchange.com – zfranciscus

答えて

3

自分でcsvファイルを解析し、TreeMapにID列のみを追加し、その行までのバイト長を値として記録します。その後、印刷のためにRandomAccessFileを使用して、対応する行を読み取ります。このアプローチがまだメモリをオーバーフローさせた場合は、MapDBをご覧ください。これは、ディスクにオーバーフローして優れたパフォーマンスを発揮するTreeMapの実装を提供します。

+0

MapDBについて私に知らせてくれてありがとう。私は私のプログラムのためにそのAPIを探求します:) – zfranciscus

1

これはあなたのボス/クライアントによってリソースが割り当てられる時間に依存します。これが問題ではない場合は、もちろん、コードの2つの部分で最適化されたバージョンを持つ必要があります。小さなファイルと大きなファイルの高速ソート、外部ソート。

クライアントがクイックソリューションを求めている場合は、質問するよりも、無制限のファイルサイズで動作する低速ソリューションが必要な場合や、メモリ制限のある高速実行ソリューションが必要な場合があります。 - あなたは彼が望むように応答を得るでしょう、そして、彼はそれはうまくいくでしょう:) - クライアントが満足すればあなたもそうです。

多分、彼は実装を望んでいます:もしソフトウェアが完全に支払われなければ、それは最大1GBのファイルしか許されないでしょう。

関連する問題