tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルランダムファイルの高速化について
記事No11683
投稿日: 2016/06/02(Thu) 18:56
投稿者SUZUKI
VB6.0からVB2005に変換挑戦中のSUZUKIです
度々 お世話になっております
下記は試行錯誤しながらランダムファイルの読込を変換したコードです
苦労して変換しましたが、読込速度が遅く実用にならない事が判明しました

色々検索しましたがなかなか対策が見つかりません

 VB6互換を使うと遅い
 FILESTREAMを使うとよくなる
 (約10年前のが多く、時代遅れという感じをますます強くしていますが、、、)

までで、FILESTREAMは何だと言うレベルです
それも固定長の例題が見つかりません
この後 どう進めたらよいかアドバイスお願いした方がよいのでは
思うようになりました
どうぞ、よろしくお願いします


   Structure FKANRI
        <VBFixedString(10)> Public 管理NO As String
        <VBFixedString(101)> Public AA As String
        Dim A As Short
        Dim B As Short
        Dim C As Short
        Dim D As Short
        <VBFixedString(41)> Public BB As String
    End Structure

    Private Sub Button1_Click()
        Dim RECORD_POS As Integer
        Dim KANRI_PATH As String
        Dim KANRI_FNUM As Integer
        Dim O As ValueType
        Dim KANRI As New FKANRI
        O = CType(KANRI, ValueType)
        KANRI_PATH = "C:\FKANRI.DAT"
        RECORD_POS = 0
        KANRI_FNUM = FreeFile()
        FileOpen(KANRI_FNUM, KANRI_PATH, OpenMode.Random, , , Len(KANRI))
        Seek(KANRI_FNUM, 1)
        Do
            If Not EOF(KANRI_FNUM) Then
                FileGet(KANRI_FNUM, O)
                RECORD_POS = RECORD_POS + 1
                KANRI = DirectCast(O, FKANRI)
                Debug.Print(KANRI.管理NO)
            End If
        Loop Until EOF(KANRI_FNUM)
        FileClose(KANRI_FNUM)
        MsgBox("正常に読み込めました" & RECORD_POS & "件")
    End Sub

[ツリー表示へ]
タイトルRe: ランダムファイルの高速化について
記事No11684
投稿日: 2016/06/03(Fri) 09:35
投稿者shu
Streamを使った方がよいとは思いますが
全レコード読み込むならそれほど変化はないのではと思います。
1度に読むレコード数を調整することで速度アップは出来るかも
しれません。
ランダムアクセスの良いところは全件読み込むのではなく
任意の1レコードを読み込むのにかかる時間に差がないことなので
ループ読みしている時点で意味がないです。

ファイル構成を変えられるなら
1レコード目に件数とか、トータルの情報を書いて置き
2レコード目からデータにするという構造にしておけば
件数を取得するのにかかる時間を節約できます。書き込むときに件数をうまく変更していく必要は
あります。

ファイル構成を変えられないなら
ファイルサイズ/レコード長で件数を求められます。

データの管理方法を変更できるならDBにしてしまうという方法もあります。

[ツリー表示へ]
タイトルRe^2: ランダムファイルの高速化について
記事No11685
投稿日: 2016/06/03(Fri) 13:13
投稿者SUZUKI
回答ありがとうございます
基本から考えるきかっけになりました

> ランダムアクセスの良いところは全件読み込むのではなく
> 任意の1レコードを読み込むのにかかる時間に差がないことなので
> ループ読みしている時点で意味がないです。
>

追加する時、データがあるかないか
どうしても全てのデータを読む必要があり
VB6.0のランダムアクセスファイルの欠点というか
うまく使っているとは言えませんでした


> ファイル構成を変えられるなら
> 1レコード目に件数とか、トータルの情報を書いて置き
> 2レコード目からデータにするという構造にしておけば
> 件数を取得するのにかかる時間を節約できます。書き込むときに件数をうまく変更していく必要は
> あります。
>
例題を件数にしてしまってすいませんでした
追加するか修正するか判断する時、最悪追加するとなった時は
全てのデータを読んでいるという事で件数にしてしまいまいSた 


>
> データの管理方法を変更できるならDBにしてしまうという方法もあります。


はい、方向性として3つ検討する事としました

1.キーだけのファイルを作って、追加?修正? 何番目かわかるようにする
2.読み書きの例題豊富なCSV形式にする(FILESTREAM採用)
  (1をFILESTREAMにするのもありか。。。。)
3.DBにする

こんな順序で検討したいと思います

[ツリー表示へ]
タイトルRe^3: ランダムファイルの高速化について
記事No11686
投稿日: 2016/06/03(Fri) 14:05
投稿者shu

> はい、方向性として3つ検討する事としました
>
> 1.キーだけのファイルを作って、追加?修正? 何番目かわかるようにする
> 2.読み書きの例題豊富なCSV形式にする(FILESTREAM採用)
>   (1をFILESTREAMにするのもありか。。。。)
> 3.DBにする
>
> こんな順序で検討したいと思います

1,3はよいですが
2はCSVにする意味はないのでBinaryReader,BinaryWriterを使って
実装するようにすればよいと思います。

[ツリー表示へ]
タイトルRe^4: ランダムファイルの高速化について
記事No11687
投稿日: 2016/06/03(Fri) 16:10
投稿者SUZUKI
> 1,3はよいですが
> 2はCSVにする意味はないのでBinaryReader,BinaryWriterを使って
> 実装するようにすればよいと思います。

おっと、そうですか
実はBinaryについて読みあさっていたのですが
コード変換が実にやっかいであきらめたばっかりです
もう一度、再検討します

[ツリー表示へ]