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

わんくま同盟

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

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


■83295 / )  Re[15]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 (23回)-(2017/03/16(Thu) 14:28:01)
Private Sub main()

    For i As Integer = 1 To 1000

        Dim s As Integer = (i - 1) * div

    For j As Integer = 1 To 10

        Dim k As Integer = (i - 1) * div + j


        Dim fs As New FileStream(StrPath(k), FileMode.Open, FileAccess.Read)
        fs.Read(bs, 0, file_size)
        fs.Close()


        MultiTask_in(j) = New Task(AddressOf Data_in, bs)
        MultiTask_in(j).Start()

    Next j



    For j As Integer = 1 To 10

        MultiTask_in(j).Wait()

    Next j

    Next i

End Sub



Private Sub Data_in(ByVal bs1() As Byte)

Dim bs0() As Byte = bs1.Clone

 Dim foundIndex As Integer = Array.IndexOf(Of Byte)(bs0, 13)


While 0 <= foundIndex

    If foundIndex + 1 < bs0.Length - 130 Then
        '次の要素を検索する
        Dim str As String = Encoding.UTF8.GetString(bs0, foundIndex, 130)
        foundIndex = Array.IndexOf(Of Byte)(bs0, 13, foundIndex + 1)
    Else
        '最後まで検索したときはループを抜ける
        Exit While
    End If
End While

End Sub

というコードを書いたのですが
Forループでバイト配列を流用したい場合
Dim bs0() As Byte = bs1.Clone
のようにして配列を一度コピーしないと、次の
ループで前のデータが上書きされてしまうと思います。

しかし、このクローンコピーは結構時間がかかってしまいます。

このクローンコピーを避けるためには、


    For j As Integer = 1 To 10
・・・・

    Next j

のところを



        Dim fs As New FileStream(StrPath(k), FileMode.Open, FileAccess.Read)
        fs.Read(bs, 0, file_size)
        fs.Close()

        MultiTask_in(1) = New Task(AddressOf Data_in, bs)
        MultiTask_in(1).Start()



        Dim fs As New FileStream(StrPath(k), FileMode.Open, FileAccess.Read)
        fs.Read(bs, 0, file_size)
        fs.Close()

        MultiTask_in(2) = New Task(AddressOf Data_in, bs)
        MultiTask_in(2).Start()

・・・


のようにしてforを使わずに書くしかないでしょうか?
もっと良い方法があれば教えてください。


返信 編集キー/


管理者用

- Child Tree -