重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ファイルの大量データ(構造体をバイナリで書き込んだ)をソートする時(構造体のメンバの1つをキーとして)に用いるソート法で高速にできるソート法はなんでしょうか?
選択法でやっているのですが遅いもので・・・・
配列ではなくてファイルに対して高速なソート法をご教示いただきたく。
ファイル全てを読んでからソートしないと厳しいでしょうか?

まだまだc言語初心者ですが、なにかアドバイスをよろしくお願い致します。

A 回答 (3件)

全データをオンメモリに持てないのでしたら、マージソートでしょう。


ただし、メモリに読めるならメモリ上で実行した方が速いので、
「ファイルから読めるだけ読んで、メモリ上ではクイックソートなどの高速なソート手段を使」って、「ソートされたデータ」群を生成し、
「ソート済データ列」に対しマージソートを実行って感じで。

例えば10000件のデータをソートするのに1000件しかメモリ上に乗らないなら、1000件ずつ読み込んで「ソートされた1000件のデータ列×10本」を作り、それをマージソートでマージして「ソートされた10000件のデータ列」を作る。
    • good
    • 0
この回答へのお礼

メモリ上でソートしてみたいと思います。
アドバイスありがとうございました。

お礼日時:2008/06/10 09:19

”ファイル内の構造体のメンバの1つをキーとして用いる”というルールがあるなら、ファイル内からキーを取り出してからソートしなきゃいけないと思うけど。


で、基本選択法がボトルネックではなくて、ファイルの読み込みがネックなんですか?

ファイルの読み込みがネックなら、環境がWindowsかUnixかわかりませんが、メモリマップドファイルで必要なところのみ参照すると速くなるかも。
    • good
    • 0

どのやり方でやるにしても、ファイルにアクセスする時間が一番かかります


指定レコードを2つファイルから読んで、そのレコードを比較、入替えが発生したら
ファイルに書いて、なんて事をしているのであれば、そのつどファイルアクセスが
発生するので大変時間がかかります

逆に、ファイルの内容全てをメモリに読込んで、メモリの中でソート処理をして
メモリの内容全てをファイルに書き込むという方法を取れば、どんなソートでも
早いです

1.ファイルのサイズを求める
2.ファイルサイズ分のメモリ確保
3.ファイル全体を読込む
4.メモリの先頭に構造体のポインタを割当てて構造体の配列として、
  ソートの処理を行う
  (4バイト境界の問題があるかも)
5.既存ファイル削除後、新規ファイルとしてファイルを作成し
  メモリの情報を全て書き込む
6.メモリの開放

こんな手順でやれば、たいがい早いです
ファイルサイズが膨大な場合、データベースを使用する事を提案します
    • good
    • 0
この回答へのお礼

ファイルアクセスを減らしながらもソートするのは難しそうですね。

お礼日時:2008/06/10 09:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!