DOBON.NET DOBON.NETプログラミング掲示板過去ログ

高速なファイルの結合

環境/言語:[C#4.0]
分類:[.NET]

C#でファイルを結合するプログラムを作りたいと考えています.

同一のハードディスクに[ファイルA] [ファイルB] があったとします.
ファイルA最後にファイルBを連結したいと考えています.
このプログラムはStreamReaderやStreamWriterをつかって書き込むしかないでしょうか?
ファイルA,ファイルBのデータ自体は同一のハードディスクにあるので,
ディスク上のセクター間をリンクを結びつけた方が処理速度が早そうな気がしますが
そんな関数はWinapiを含めて存在するでしょうか?
  • 題名: Re[1]: 高速なファイルの結合
  • 著者: オショウ
  • 日時: 2011/03/27 11:23:28
  • ID: 28346
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> このプログラムはStreamReaderやStreamWriterをつかって書き込むしかないでしょうか?

  結論から言うと、そういう方法しかないです。

> ファイルA,ファイルBのデータ自体は同一のハードディスクにあるので,
> ディスク上のセクター間をリンクを結びつけた方が処理速度が早そうな気がしますが
> そんな関数はWinapiを含めて存在するでしょうか?

  APIは無いです。
  ただ物理的にHDDにアクセスする方法はありますが・・・
  今回のケースでは、ファイルの最後尾が、論理セクタサイズの
  途中までしか使っていなかった場合・・・次のファイルの先頭
  に便宜的に連結してしまった場合、ファイルサイズが狂うとい
  うか、ゴミが連結部分にできてしまうと思われますが・・・

  よって、その隙間分、必ず連結される側のファイルはズレる事
  になるので、結果、大半のケース、連結するファイルは全て読
  んで書き直すことになるので、高速化はキャッシュに乗ってい
  たか乗っていなかった程度になるかと。

※ ほかにもまだ問題になることがあるので、簡単にできない。

以上・・・
■No28345に返信(Yossyさんの記事)

StreamReaderやStreamWriterを使うやり方にはなると思いますが

StreamWriterをAppendで開いてStreamReaderで一括読み、StreamWriterへの
一括書込みをすればそんなには遅くないんじゃないかな。
■No28347に返信(shuさんの記事)
> StreamWriterをAppendで開いてStreamReaderで一括読み、StreamWriterへの
> 一括書込みをすればそんなには遅くないんじゃないかな。

この方法を試される際は、ファイルサイズに注意してください。
気にするべきは、1GB 超えるレベルのファイルサイズだとメモリ確保に失敗するという点と、逆に効率が悪くなるサイズがありうる点です。
StreamWriter、StreamReader は文字コードを指定して読み書きするクラスですよね
。文字のエンコード、デコードの処理はコストが高いです。
ファイルを結合するだけであれば FileStream クラスを使用するほうがよいかもしれ
ません。
お返事ありがとうございました.
大変参考になりました.

DOBON.NET | プログラミング道 | プログラミング掲示板