C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 80 を表示中)
■46946 / )  Re[2]: CSVファイル入出力時の速度向上方法について
□投稿者/ れい (872回)-(2010/02/15(Mon) 08:32:56)
一般に、ファイルの先頭を削除するのはかなり難しい問題です。

とりあえず、
無視する行数を読んだ後に1行ずつ読んで書くのではなく、
1MByte程度ずつ読んで書くようにすると多少良くなると思います。

ですが、本質的には改善されないでしょう。

ドライブが複数用意できたり、莫大なRAID構成だったりする場合は違いますが、
ほぼすべての時間がディスクアクセス、とくに書き込みに取られるはずです。

ですので、解決するには少し工夫が必要になります。

No46943 (やじゅ さん) に返信
> 単純に考えたのは、1つのファイルを半分の行数ずつ読んで、前半と後半で2つのファイルに
> 書き込んで、最後にファイル連結をする。

書き込み速度がボトルネックになっているはずですので、
やじゅさんのやりかたでは余計に時間を食うはずです。

ファイルの大部分が実質変更されていないので、そこを書き直さないようにすればいいのですが、
殆どのファイルシステムでは、これは大変困難な作業になります。

ですが、CSVの特徴をうまく使えば比較的簡単にできます。

たとえば、最終的にCSVを読むソフトウェアに、
「コメント行を意味するエスケープ」がある場合があります。
行頭に「#」があったら移行は読まない、というような。

そういうものがあるのでしたら飛ばしたい行の先頭に「#」を書けば目的が達成されます。
「上書き」で書けば先頭の1セクタorクラスタ分の書き込みで済みます。

CSVに、余計な列を一つ付けてもいい、という条件でも構いません。
最初の1行の後ろに、次の行とうまく整合するように無駄なバイト列を追加するだけです。

CSVに、長さ可変の列、たとえば数字の列がある場合、「1」と「0001」が同じ値を意味する場合は、
これを利用する手もあります。

当然、無駄文字のあるUnicodeを使う手もあります。少し危険ですが。

バイト数と行数と、両方管理してうまく整合させるのでアルゴリズムは面倒ですが、
うまくつくれば何万倍も速く処理できます。
HDDへの負荷も小さいし。

返信 編集キー/


管理者用

- Child Tree -