- ベストアンサー
「ファイルが無い」というエラー
C#で、開発環境はおそらくVisualStudio2008、OSは7です。 数百万回程度ファイルを作成、書き込み、読み込み、消去を繰り返すと、 最初は問題ないのですが、 そのうち「ファイルがありません」という内容のエラーが出ます。 フォルダを見ると確かにありません。 file.existsメソッドを入れて ファイルが存在しない場合にはその処理をしないようにしても、 何事もなく通過するにもかかわらず、やはりエラーになります。 CPU処理速度がハードディスク書き込み速度を上回っているからかと思い、 Console.writeで無駄な出力を行い、処理を遅くしてみましたが、 状況は変わらないようです。 どのように対処したらよいでしょうか? なお、「数百万回程度ファイルを作成、書き込み、読み込み、消去を繰り返」さず、 関数間で直接データをやりとりすることもおそらく可能ですが、 今後のことを考え、とりあえずそういう実装になっています。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
どんな方法でやってるかわからないのですが。 そのファイル操作の間に、他の処理が入っている、というのがありそうです。 消去処理開始 ↓file.existsで存在を確認 ↓消去完了 ↓読み出そうとする→消去されているのでエラー 特に、マルチスレッドで処理されていたら スレッドA:file.existsで存在を確認 スレッドB:消去処理開始 スレッドB:消去完了 スレッドA:読み出そうとする→消去されているのでエラー ってこともあります。 このような場合だったら、対策は「排他処理をきっちりと行う」となります。 もっとも、数百万回の作成→消去 というのは、ハードディスクの寿命を縮めそうです。SSDやUSBメモリだったら下手すれば終ります。 ファイルアクセスは、コンピュータの処理の中でもっとも時間が長いものの一つですから、パフォーマンスにも影響大です。CPUのクロックが倍半分違っても実行時間がほとんどかわらない、なんてこともありえます。 「今後のことを考え」るのなら、数百万もファイルアクセスする方法は改めた方がよいでしょう。
その他の回答 (7)
- いけだ ひろし(@ike-2000)
- ベストアンサー率53% (69/129)
削除が失敗することがあるということであれば、インデックスの作成が怪しくないですか?。 APIのエラー情報を全ておいて出力すること(エラー時だけ)をお勧めします。 また、「Console.writeで無駄な出力を行い、処理を遅くしてみましたが」はバグを残すもとです。不安があるならフラッシュしましょう。
- Tacosan
- ベストアンサー率23% (3656/15482)
「今後のこと」が分からないのでてきと~に反応しますが.... C# は全然使っていないのですが, 「プログラム間のデータのやり取り」に IPC って使えないんでしょうか. なんというか, 「ファイルで受け渡し」って「本来構造があるはずなのにわざわざファイルという構造のないものに落としている」って感じがして気に入らないんですが.
お礼
皆様ご回答していただき、ありがとうございます。 この場でまとめてお礼申し上げます。 さて、「今後のこと」にそんなにこだわってほしくないのですが、 一応説明しておきますと、私が作成しているアプリは、将来的には、 実行、結果をファイルに保存 ↓ PC再起動 ↓ 実行、結果をファイルに保存 ↓ ・・・ という繰り返しになると思われます。 しかしながら、現在はまだ検証段階ですので、 PC再起動部分は飛ばして実行しております。
- D-Matsu
- ベストアンサー率45% (1080/2394)
「今後のこと」というのが「プログラム間でのデータ受け渡し」を指しているのであれば(というかわざわざファイルに書き出す理由がそれしか思い当たらない)、メモリマップドファイルの方が妥当かと思います。 そんなに多量のファイルI/Oを繰り返すのはHDD寿命的にもパフォーマンス的にもあまりよろしくないので、作りの見直しを検討される方がよいかと。
- redfox63
- ベストアンサー率71% (1325/1856)
System.IO.MemoryStreamを使えばいいのかも ・・・
お礼
そんなものがあるんですね。 早速明日試してみます。
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず私も #1 の最後と同意見. プログラム間でデータをやり取りするならさておき, 1つのプログラムの中で「ファイルを使って関数間のデータのやり取りをする」というのはあんまり自然な感じがしません. 特に今回はやり取りするデータが MB のオーダでしかありませんから, なおさら「直接渡した方がまとも」に感じます. もちろんあなたの見据えた「今後」にもよりますが, 一般論としては不自然な実装になっていると思います.
- aris-wiz
- ベストアンサー率38% (96/252)
まず現象について、もう少し詳しく補足してもらえないでしょうか? エラーとありますが、どの様なエラーが出るのでしょうか? また、質問からは分かりませんが該当のアプリケーションは、 マルチスレッド上でファイルIOを行うことはありませんか? テストを行っていた時、同じ実行ファイルを2回起動し プログラム内で、同じファイルを指定したりしていませんか?
- kmee
- ベストアンサー率55% (1857/3366)
メモリとディスクは別物です。 通常は、メモリ上にファイルは作成されません。 メモリ上に作りたいのなら、それなりのしくみを用意する必要があります。 (ラムディスク、共有メモリ など) ハードディスクやOS(Windows)にはキャッシュというしくみがあって、ある程度まとめてディスクアクセスするため、読み書き全てにアクセスが発生するわけではありません。 しかしながら ・キャッシュは同じ領域へのアクセスに便宜をはかる仕組みなので、今回のような「作成→消去」のくりかえしには効果は薄い ・最終的には、キャッシュの内容をディスクに反映させるためにアクセスが発生する ・キャッシュのサイズは決して大きなものではないんで、今回の内容をヒットミス無しに1回のアクセスで、というのはまず無理 等々の理由で、アクセス回数を大幅に減らせるものでもありません。
お礼
ありがとうございます。 そもそもファイルを作成すると必ずハードディスクにアクセスするものなのでしょうか? メモリ上に作成してくれても問題ないのですが。
補足
ファイルのサイズは1MBもないので、 メモリ上のファイル作成は十分可能です。