2013-10-28 3 views
0

Я читаю небольшой байтовый файл (около 32 Мбайт) байт в таблицу данных и преобразую первые 8 байтов из шестнадцатеричного в двоичный.Чтение небольшого двоичного файла, исключение из памяти

С большими файлами я сталкиваюсь с сообщениями об ошибках с ошибками System Out of memory, и я не могу подумать, как улучшить мой код, чтобы он работал более плавно или быстрее.

Вот мой код:

Public Function DecToBin(ByVal DeciValue As Long, Optional ByVal NoOfBits As Integer = 8) As String 
    Dim i As Integer 
    Do While DeciValue > (2^NoOfBits) - 1 
     NoOfBits = NoOfBits + 8 
    Loop 
    DecToBin = vbNullString 
    For i = 0 To (NoOfBits - 1) 
     DecToBin = CStr((DeciValue And 2^i)/2^i) & DecToBin 
    Next i 
End Function 

Private Sub importData(ByVal openFile As String) 
    If fullFilePath.EndsWith("variable.dat") Then 
     Dim importedData As New DataTable 
     Cursor.Current = Cursors.WaitCursor 
     Using reader As New BinaryReader(File.Open(openFile, FileMode.Open)) 
      Dim pos As Integer = 0 
      Dim length As Integer = reader.BaseStream.Length 
      loadingBar.loadingLabel.Text = "Lines of data: " & length 

      loadingBar.loadingProgress.Minimum = 0 
      loadingBar.loadingProgress.Maximum = length 
      loadingBar.loadingProgress.Step = 1 

      importedData.Columns.Add("Data0") 
      importedData.Columns.Add("Data1") 
      importedData.Columns.Add("Data2") 
      importedData.Columns.Add("Data3") 
      importedData.Columns.Add("Data4") 
      importedData.Columns.Add("Data5") 
      importedData.Columns.Add("Data6") 
      importedData.Columns.Add("Data7") 

      importedData.Columns.Add("Time") 
      importedData.Columns.Add("Date") 

      importedData.Columns.Add("Day") 
      importedData.Columns.Add("Month") 
      importedData.Columns.Add("Year") 

      importedData.Columns.Add("Blank") 

      While pos < length 

       For i = 0 To 15 
        Dim value As Decimal = reader.ReadByte 
        rawDataArray(i) = value.ToString() 
        pos += 1 
       Next 

       loadingBar.BringToFront() 
       loadingBar.Show() 
       Cursor.Current = Cursors.WaitCursor 

       loadingBar.loadingProgress.Value = pos 


       convertedDataArray(0) = DecToBin(rawDataArray(0)) 
       convertedDataArray(1) = DecToBin(rawDataArray(1)) 
       convertedDataArray(2) = DecToBin(rawDataArray(2)) 
       convertedDataArray(3) = DecToBin(rawDataArray(3)) 
       convertedDataArray(4) = DecToBin(rawDataArray(4)) 
       convertedDataArray(5) = DecToBin(rawDataArray(5)) 
       convertedDataArray(6) = DecToBin(rawDataArray(6)) 
       convertedDataArray(7) = DecToBin(rawDataArray(7)) 

       convertedDataArray(8) = Format((rawDataArray(12) + 0), "00") & ":" & Format((rawDataArray(11) + 0), "00") & ":" & Format((rawDataArray(10) + 0), "00") & "." & Format((rawDataArray(8) * 256) + rawDataArray(9), "000") 
       convertedDataArray(9) = Format((rawDataArray(13) + 0), "00") & "." & Format((rawDataArray(14) + 0), "00") & "." & "20" & Format((rawDataArray(15) + 0), "00") 

       convertedDataArray(10) = Format((rawDataArray(13) + 0), "00") 
       convertedDataArray(11) = Format((rawDataArray(14) + 0), "00") 
       convertedDataArray(12) = Format((rawDataArray(15) + 0), "00") 

       importedData.Rows.Add(convertedDataArray) 
       Application.DoEvents() 
      End While 
      loadingBar.Close() 
      importedData.DefaultView.Sort = "Year,Month,Day,Time" 
      dataGrid.DataSource = importedData.DefaultView 
     End Using 
     dataGrid.Columns(0).Visible = False ' Data 0 
     dataGrid.Columns(1).Visible = False ' Data 1 
     dataGrid.Columns(2).Visible = False ' Data 2 
     dataGrid.Columns(3).Visible = False ' Data 3 
     dataGrid.Columns(4).Visible = False ' Data 4 
     dataGrid.Columns(5).Visible = False ' Data 5 
     dataGrid.Columns(6).Visible = False ' Data 6 
     dataGrid.Columns(7).Visible = False ' Data 7 
     dataGrid.Columns(8).Visible = True ' Data Time 
     dataGrid.Columns(9).Visible = True ' Data Date 
     dataGrid.Columns(10).Visible = False ' Data Day 
     dataGrid.Columns(11).Visible = False ' Data Month 
     dataGrid.Columns(12).Visible = False ' Data Year 
     dataGrid.Columns(13).Visible = False ' Data Blank 

    Else 
     MsgBox("Wrong file selected") 
    End If 
End Sub 

Пример считываемых данных:

3F F3 45 C6 03 00 11 00 00 6F 1F 1D 16 12 07 0D

Пример вывода:

00111111 1 1110011 01000101 11000110 00000011 00000000 00010001 00000000 22: 29: 31,111 18.07.2013 18 07 13

+0

вопрос относится к codereview – Peter

+0

@peer Я не вижу, как; он задает вопрос о конкретной проблеме - OOM при обработке того, что есть, несмотря на описание OP, *** small *** file –

+1

Почему вы делаете все вещи 'ToString()'/'DecToBin'? 'ReadByte()' уже *** возвращает 'byte' *** (в частности, он возвращает' int', который либо отрицателен для EOF, либо в диапазоне 0-255 - его просто нужно отличить как ' byte' и: job done): есть ли у вас пример ввода/вывода того, что вы пытаетесь сделать? потому что он очень похож на то, что вы изобретаете работу посередине здесь ... Также: какой тип 'convertDataArray'? (не показано) –

ответ

1

Получение System.OutOfMemoryException означает, что нет ни одного подряда области нераспределенной памяти требуемого размера доступного. Это не обязательно означает, что у вас нет памяти, а скорее, что память фрагментирована слишком сильно.

Одним из способов решения проблемы может быть использование класса MemoryMappedFile, который (как следует из названия) будет отображать часть виртуальной памяти процесса на данные на вашем жестком диске, например.

Другой способ, которым вы могли бы попытаться решить проблему, может быть вызван GC.Collect, который будет уплотнять память как часть процесса сбора мусора. Хотя, я бы сильно отказался от использования этого метода.

Вы можете использовать ANTS Memory Profiler или windbg (поставляется как часть Windows SDK), чтобы узнать, где используется ваша память.

Что касается вашего кода, у вас в нем нет ничего подозрительного (кроме DecToBin, о котором Марк Гравелл уже указал).

Надеюсь, это поможет.

Смежные вопросы