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

固定長ファイルのアクセス時間の件

分類:[.NET]

簡単な質問ですみません。宜しくお願いします。
固定長文字列ファイルの高速アクセス方法を教えて下さい。

固定長文字列ファイル(例)abcdヤマモト タロウ  077846<crlf>

   abcdは半角英字,ヤマモト タロウ  はシフト−jis
   077846は半角数字で各フィールドは固定長文字列となっています。
   フィールドの未使用部分は半角スペースで埋められます。実際のファイルは
   1行が1881byteで500行程あります。
   ここで問題はヤマモト タロウ  の部分で未使用部分を半角スペースで
   埋めますので名前により全体の文字数が変わることです。
   x=Mid(y,i,j)はbyte数ではなく文字数で指定しますので
   077を抜き出すことが出来ません。従ってシーケンシャルモードで
   1行読み込んだ後各フィールドに格納できません。

そこで固定長文字列に対応する構造体を定義しランダムファイルとして読み出し
可能です。
しかし、ファイルは全て読み込みますのでできればシーケンシャルファイルとして
読み込みたい。
理由は読み込むためのアクセス時間です。
前述の1881byte、500行を読むのにシーケンシャルモードで1秒以下
ランダムファイルで9秒と圧倒的な差が生じます。
(Window’s2000 1.5GHz  メモリー256Mbyte)
データの検索等を行いますので、ひどい時は10分位パソコンがビジー状態になります。
ファイル形式の変更はできませんので、プログラムで対処するしかありません。
言語はVB.NETです。

どなたか高速にファイルを読み込む方法を教えてください。




   
> そこで固定長文字列に対応する構造体を定義しランダムファイルとして読み出し
> 可能です。
> しかし、ファイルは全て読み込みますのでできればシーケンシャルファイルとして
> 読み込みたい。
> 理由は読み込むためのアクセス時間です。
> 前述の1881byte、500行を読むのにシーケンシャルモードで1秒以下
> ランダムファイルで9秒と圧倒的な差が生じます。
> (Window’s2000 1.5GHz  メモリー256Mbyte)
> データの検索等を行いますので、ひどい時は10分位パソコンがビジー状態になります。

今はそれぞれ、どんなコードを書かれているのでしょう?
■No1402に返信(よねKENさんの記事)
>>前述の1881byte、500行を読むのにシーケンシャルモードで1秒以下
>>ランダムファイルで9秒と圧倒的な差が生じます。
>>(Window’s2000 1.5GHz  メモリー256Mbyte)
>>データの検索等を行いますので、ひどい時は10分位パソコンがビジー状態になります。
>
> 今はそれぞれ、どんなコードを書かれているのでしょう?
>

早速の回答有難うございます。
構造体 MainData 、OptionData1、OptionData2
の詳細はかなり長くなるので省略させていただきます。
コードは次の通りです。



'1レコード分のデータ読み込み変数
Private Structure GetDate
Dim Main As MainData 'MainData は構造体
<VBFixedArray(4)> Dim Opt1() As OptionData1 'OptionData1 は構造体
<VBFixedArray(49)> Dim Opt2() As OptionData2 'OptionData2 は構造体
End Structure

Public Sub Prtest()

Dim Time1, Time2, Time3, Time4 As Date
Dim Rdx(500) As String 'シーケンシャルファイルの読み込み変数
Dim i, j As Integer
Dim Rdrec(500) As GetDate 'ランダムファイルの読み込み変数
Dim van_u_file = "C:\DATA\SAMPLE.txt"
Dim Frec As Integer



'ランダムファイルとシーケンシャルファイルの読み込み時間の測定
Time1 = Today.Now '測定開始時刻

Frec = 0
FileOpen(1, van_u_file, OpenMode.Random, , , 2881) 'サンプル ファイル オープン
Do Until EOF(1)
Frec += 1
FileGet(1, Rdrec(Frec - 1), Frec)
Loop
FileClose(1)


Time2 = Today.Now 'ランダム読み込み終了時刻(9秒経過)


i = 0
FileOpen(1, van_u_file, OpenMode.Input) 'サンプル ファイル オープン
Do Until EOF(1)
i += 1 '最終結果はFrec と同じ行数読み込んでいる(445行)
Rdx(i) = LineInput(1)
Loop
FileClose(1)

Time3 = Today.Now 'シーケンシャル読み込み終了時刻(1秒未満 約0.3秒)



'ランダムファイルで読み込めばフィールドに格納されているのでOKですが時間がかかる。


'(例)
'シーケンシャルファイルで読んだ後は1075バイト目に書かれている内容を
'次の様にフィールドに格納したいが抜き取り開始位置が文字数指定のため
'シフトJISで書かれた名前の部分で変動しうまくできない。

Rdrec(i).Opt1(j).u_年月日 = Mid(Rdx(i), 1075, 8)

End Sub
Private Structure GetDate
Dim Main As MainData 'MainData は構造体
<VBFixedArray(4)> Dim Opt1() As OptionData1 'OptionData1 は構造体
<VBFixedArray(49)> Dim Opt2() As OptionData2 'OptionData2 は構造体
End Structure


VB6互換モードを使っているのが遅い原因だと思われます。

私も以前に経験したことがあり、VB6互換モードだと 5秒かかるのに
FileStreamを使って読むと0.05秒となり、
VB6互換モードを使うと100倍も遅くなることを確認したことがあります。
■No1411に返信(ポンさんの記事)
> <VBFixedArray(49)> Dim Opt2() As OptionData2 'OptionData2 は構造体
> End Structure
>
> ↑
> VB6互換モードを使っているのが遅い原因だと思われます。
>
> 私も以前に経験したことがあり、VB6互換モードだと 5秒かかるのに
> FileStreamを使って読むと0.05秒となり、
> VB6互換モードを使うと100倍も遅くなることを確認したことがあります。
>

有難うございます。早速試してみます。
結果が出ましたらご報告させて戴きます。
■No1426に返信(平さんの記事)
> ■No1411に返信(ポンさんの記事)

>
> 有難うございます。早速試してみます。
> 結果が出ましたらご報告させて戴きます。

ポンさん 有難うございました。
FileStreamでご指摘どうり高速でアクセスできました。
今後とも宜しくお願いします。
解決済み!

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