none
ファイルの非同期I/Oについて教えてください。 RRS feed

  • 質問

  • こんにちは。

    ある作成中のアプリケーションで、データ処理と、ファイル書き出しを同時に行おうと思っています。

    このをマルチスレッドで行う場合と、非同期I/Oで行う場合と、どちらが高速に処理できるのでしょうか?

    もちろん、同一のPCで実行した場合です。

    OSはWindowsXP(x86)です。

    よろしくお願いいたします。
    2009年4月1日 4:56

回答

  •  こういうのは「やってみなければわからない」というのが答えになります。
    だれも正確なことはわかりません。
     場合によっては「シングルスレッド」で素直に書いたものが
    一番早いという結果になったりします。というのも、最近のHDDは
    大量のバッファを持っているのが原因の一つと思われます。つまり、

    >シングルスレッドでやると、データ吐き出しが終るまで処理がストップしてしまいますので、

    が、ストップしないで、わりとすぐに戻ってきてしまうわけですね。
    この場合、データバッファを2つ持っていること自体も合理性が怪しくなってしまいます。
    「データ処理スレッド」と「ファイル書き出しスレッド」にすればよかった
    ・・・なんてオチになったりします。

    まぁ、いままでDisk上のファイルの非同期で「良かった」ことが一度も無いので、
    これはまったくお勧めしません。扱いがデリケートな割りに少しも効果が感じられない
    というのが素直な感想ですね(笑)。

    • 回答としてマーク Barkmann 2009年4月3日 4:41
    2009年4月2日 9:18

すべての返信

  • 処理するデータと、ファイルへ書き出すデータの関係は?
    処理が済んだデータをファイルに書き出すのであれば、どうしてもシーケンシャルにしなければならないところがありますよね。そういった、データとファイルの関係が(この質問文を読んだだけの人には)わからないので、なんとも。。。
    Jitta@わんくま同盟
    2009年4月1日 14:05
  • レスありがとうございます。

    説明不足で済みません。

    データの処理とディスクへの書き出しは、ピンポン方式で交互に行います。

    例えば、データバッファ [A] と [B] があるとしますと、

    1:  [A] 処理中           [B] 待機
    2:  [A] データ吐き出し [B] 処理中
    3:  [A] 処理中           [B] データ吐き出し
    4:  [A] データ吐き出し [B] 処理中
    5:  [A] 処理中           [B] データ吐き出し
         ...

    こういった処理を延々と繰り返します。

    シングルスレッドでやると、データ吐き出しが終るまで処理がストップしてしまいますので、そこで非同期I/Oでやるのとマルチスレッドでやるのとの効率の違いを知りたいのですが。

    まだ説明不足でしょうか…。
    うまくできなくて済みません。
    よろしくお願いします。
    2009年4月1日 23:36
  •  こういうのは「やってみなければわからない」というのが答えになります。
    だれも正確なことはわかりません。
     場合によっては「シングルスレッド」で素直に書いたものが
    一番早いという結果になったりします。というのも、最近のHDDは
    大量のバッファを持っているのが原因の一つと思われます。つまり、

    >シングルスレッドでやると、データ吐き出しが終るまで処理がストップしてしまいますので、

    が、ストップしないで、わりとすぐに戻ってきてしまうわけですね。
    この場合、データバッファを2つ持っていること自体も合理性が怪しくなってしまいます。
    「データ処理スレッド」と「ファイル書き出しスレッド」にすればよかった
    ・・・なんてオチになったりします。

    まぁ、いままでDisk上のファイルの非同期で「良かった」ことが一度も無いので、
    これはまったくお勧めしません。扱いがデリケートな割りに少しも効果が感じられない
    というのが素直な感想ですね(笑)。

    • 回答としてマーク Barkmann 2009年4月3日 4:41
    2009年4月2日 9:18
  • こんにちは。レスありがとうございます。

     こういうのは「やってみなければわからない」というのが答えになります。
    だれも正確なことはわかりません。
     場合によっては「シングルスレッド」で素直に書いたものが
    一番早いという結果になったりします。というのも、最近のHDDは
    大量のバッファを持っているのが原因の一つと思われます。

     やっぱり、やってみないとわからないですか。テストする時間がないため、安易にフォーラムに質問を投稿してしまいました(汗)。

     が、ストップしないで、わりとすぐに戻ってきてしまうわけですね。
    この場合、データバッファを2つ持っていること自体も合理性が怪しくなってしまいます。
    「データ処理スレッド」と「ファイル書き出しスレッド」にすればよかった
    ・・・なんてオチになったりします。

     実はデータがDMAで勝手に流れてくるようになっていまして、本当は3つ以上のバッファで構成されます。
    マルチスレッドでやるのが、やっぱり良いみたいですね。

     まぁ、いままでDisk上のファイルの非同期で「良かった」ことが一度も無いので、
    これはまったくお勧めしません。扱いがデリケートな割りに少しも効果が感じられない
    というのが素直な感想ですね(笑)。

     経験された方の意見は大変参考になります。OPERLAPPED I/Oは面倒なわりに、期待した効果が得られないということですね(苦笑)。
    ありがとうございました。

    2009年4月3日 4:41