|
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を使わずに書くしかないでしょうか?
もっと良い方法があれば教えてください。
|