解析与文件流并行的HEX文件

时间:2017-08-25 09:23:47

标签: vb.net for-loop filestream

所以我试图加快For i as integer以获得最大预备。我在我的代码中使用了越来越多的Parrallel和Async方法,这对我有很大的帮助。然而,目前我仍然坚持这一个。我只是循环读取一个文件读取特定的索引位置,以查看文件中的内容,以便我以后可以用它做某些事情。

这是当前For的一个例子:

Using fs As New FileStream(PathToFile, FileMode.Open, FileAccess.Read, FileShare.Read)    
     For i As Long = 0 To fs.Length Step 1024

          'Go to the calculated index in the file
          fs.Seek(i, SeekOrigin.Begin)

          'Now get 24 bytes at the current index
          fs.Read(buffer, 0, 24)

          'Do some stuff with it
          List.Add(Buffer)
      Next
End Using

文件大小可以是15MB到4GB。目前我仍然坚持如何在Parrallel.For中使用步骤1024以及如何使用线程安全的方法。希望有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

这可能会被标记下来,但如果内存使用不是一个大问题,那么我建议读取整个文件并将这些24字节序列存储在byte(23)的数组中。然后使用Parallel.For处理数组。在我的电脑上,阵列占用大约160mb,4gb。读取速度当然取决于所使用的系统。在我的电脑上大约需要25秒。

试试这个..

Imports System.Math
Imports System.IO

Public Class Form1
    'create the data array, with just 1 element to start with
    'so that it can be resized then you know how many 1024 byte
    'chunks you have in your file
    Dim DataArray(1)() As Byte


    Private Sub ReadByteSequences(pathtoFile As String)
        Using fs As New FileStream(pathtoFile, FileMode.Open, FileAccess.Read, FileShare.Read)
            'resize the array when you have the file size
            ReDim DataArray(CInt(Math.Floor(fs.Length) / 1024))
            For i As Long = 0 To fs.Length Step 1024
                Dim buffer(23) As Byte
                fs.Seek(i, SeekOrigin.Begin)
                fs.Read(buffer, 0, 24)
                'store each 24 byte sequence in order in the 
                'DataArray for later processing
                DataArray(CInt(Math.Floor(i / 1024))) = buffer
            Next
        End Using
    End Sub

    Private Sub ProcessDataArray()
        Parallel.For(0, DataArray.Length, Sub(i As Integer)
                                              'do atuff in parallel
                                          End Sub)
    End Sub

End Class