1つのファイルに2人が同時に開いて書き込みたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

1つのファイルに2人が同時に開いて書き込みたい

#1

投稿記事 by shiro4ao » 11年前

こんにちは、なんどもトピ立てすみません

いま、ファイルにかなり大きな情報を書き込むソフトを作っているのですが、かなりの書き込み時間がかかります。
そこで、マルチスレッドで書き込む量を何分割かして同時に書き込めれば倍早くなるかなあと思ったのですが
そういう方法はあるでしょうか、それとも処理系依存だったり、そもそもそんなことできなかったりするんでしょうか?

イメージとしては書き込むデータを真ん中から山分けして一人はファイルの頭から、
もう一人はファイルの真ん中から同時に書き込むイメージです。
(ディスクIOがボトルネックになりそうですが、今よりは早いんじゃないかなと思っています)

処理系:Win7
開発環境:BorlandC++,VisualC++

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 1つのファイルに2人が同時に開いて書き込みたい

#2

投稿記事 by softya(ソフト屋) » 11年前

そのファイルの全容量をいっぺんに書き込む必要があるデータなら処理時間の大半をアクセス時間が占めることになるのでスレッド化すれば遅くなっても早くなることはありません。
CPU時間 < ファイルの処理時間(アクセス待ち時間・回転待ち時間・書き込み処理時間)
であるためです。

部分的な書き換えであれば、データベースを使ったほうが効率よく処理できる可能性があります。
あるいは、 CPU時間 > ファイルの処理時間 であればスレッド化が意味を持つ可能性もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 1つのファイルに2人が同時に開いて書き込みたい

#3

投稿記事 by shiro4ao » 11年前

う~ん。やっぱりうまくいかないのですね。
ちょっと考え直してみます。

書き込み高速化とは別に、単純な質問として、
ファイルに対する同時書き込みは可能なのでしょうか。
処理系はWindowsとした場合です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 1つのファイルに2人が同時に開いて書き込みたい

#4

投稿記事 by softya(ソフト屋) » 11年前

shiro4ao さんが書きました:う~ん。やっぱりうまくいかないのですね。
ちょっと考え直してみます。

書き込み高速化とは別に、単純な質問として、
ファイルに対する同時書き込みは可能なのでしょうか。
処理系はWindowsとした場合です。
同時は排他的にしないとダメですね。
最初から必要なファイルサイズを全部確保しておいて決して同じセクタに書き込まない様に非干渉領域を設けてやれば排他処理しなくても出来そうですが、ファイルシステムの裏を書くようなものなのでオススメできません。あとシークが激しくてHDDが死にそうになるかも。

書き込み専用のプロセスを生成して、別の2つのアプリからプロセス間通信で書き込みデータを送り込むという手もあります。
2つの別のPCにあるアプリから共有PCに書き込みむならサーバー型通信アプリとしたほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 1つのファイルに2人が同時に開いて書き込みたい

#5

投稿記事 by shiro4ao » 11年前

おお・・・・ファイルシステム的にはそんな挙動は意図してないのですね・・・残念。
おっしゃるとおりHDDのヘッドが大忙しですね、むしろオーバーヘッドが大きくなるかもしれませんorz
もうHDDを3つ壊しているのでちょっと無理はさせられないですね。

同時書き込みのように見せかけるレイヤをつくるのはやはりオーバーヘッドの問題と
結局一人が書き込んでいるので実現しても効果がどれ程なのかちょっと難しいですね。

多少の書き込み時間は受け入れることにします。
これにて解決をさせていただきます。
ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 1つのファイルに2人が同時に開いて書き込みたい

#6

投稿記事 by softya(ソフト屋) » 11年前

どうしても書き込みを早くしたいなら高速HDDを使うとかRAID 0でストライピングを構成するとか手はあります。
固体メモリのSSDを使えば早くなります。
まぁ、最大の問題は毎回全部を書き出す必要があるのかに尽きるのですが。

【補足的なシーク時間】
HDDのシーク時間について。これはHDDのヘッドを動かす時間です。
平均シーク時間は平均値の時間で最悪の場合は倍以上の時間が必要です。
個人のHDDは大抵平均シーク時間が10ms前後ですので、ファイルを書き込み度に10msをロスする可能性があると思ってください。
ただし、シーケンシャルに連続書き込みしたい場合はシーク時間はほとんど無視ができます。
shiro4aoさんの案は交互に書き込むということなので、シーク時間が大半になると思います。
つまり、10KBづつ交互に書き込みとして1秒間に書き込めるのは10KB*1000ms/10msとなりますので、1MBがやっとで遅くなることが分かります。

【追記】
Linuxであれば同時書き込みを考慮したファイルシステムがあるようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 1つのファイルに2人が同時に開いて書き込みたい

#7

投稿記事 by shiro4ao » 11年前

書き込み速度の概算なんてすごいですね
ハードのことを考えたら同時書き込みなんて害悪でしかないわけで・・・・
なかなか、思ったとおりには行きませんね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 1つのファイルに2人が同時に開いて書き込みたい

#8

投稿記事 by softya(ソフト屋) » 11年前

shiro4ao さんが書きました:書き込み速度の概算なんてすごいですね
ハードのことを考えたら同時書き込みなんて害悪でしかないわけで・・・・
なかなか、思ったとおりには行きませんね。
まぁ、あれは大雑把すぎますけどね。

ソフトウェアの設計において容量や処理時間の見積りは非常に重要な要素です。
作ったがまともに動きませんでは許されないのでCPU負荷・通信負荷・HDDなど処理時間は設計時に概算で計算しておくことが必要になります。
場合によっては、概算出来るだけの情報を得るために速度計測プログラムを実際に動かしてテストします。

もし、ソフトウェア業界に就職されるなら覚えておいてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る