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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.83295 の関連記事表示

<< 0 >>
■83295  Re[15]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 -(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を使わずに書くしかないでしょうか?
    もっと良い方法があれば教えてください。
    
    
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -