2014-10-27 4 views
1

Мне было очень приятно помочь с этим кодом, однако я ударил камень преткновения, и я не уверен, как правильно идти. У меня есть код ниже, который находит и заменяет более 120 тыс. Найденных и заменяет. Проблема в том, что текстовый файл ОГРОМНЫЙ легко превышает 5 гигабайт файлов журнала, поэтому я получаю проблему с памятью, что не удивительно. Так что я загружаю данные в блоки, если это возможно ?, если да, то как.Replace Memory Issue VB.net


Private Sub CmdBtnTestReplace_Click(sender As System.Object, e As System.EventArgs) Handles CmdBtnTestReplace.Click 
    Dim fName As String = "c:\backup\logs\master.txt" 
    Dim wrtFile As String = "c:\backup\logs\masterUserFormatted.txt" 
    Dim strRead As New System.IO.StreamReader(fName) 
    Dim strWrite As New System.IO.StreamWriter(wrtFile) 
    Dim s As String 


    s = strRead.ReadToEnd() 

    'runs through over 120k of find and replaces 
    For Each row As DataGridViewRow In DataGridView1.Rows 
     If Not row.IsNewRow Then 

      Dim Find1 As String = row.Cells(0).Value.ToString 
      Dim Replace1 As String = row.Cells(1).Value.ToString 

      Cursor.Current = Cursors.WaitCursor 

      'replace using string from 1st column and replaces with string from 2nd column. 
      s = s.Replace(Find1, Replace1) 

     End If 

    Next 

    strWrite.Write(s) 
    strRead.Close() 
    strWrite.Close() 

    Cursor.Current = Cursors.Default 
    MessageBox.Show("Finished Replacing") 

End Sub 

ответ

1

Если входной файл является простой многострочный текстовый файл, в котором ни один человек линия не слишком большой, чтобы загрузить в память сразу, а строка поиска никогда не будет содержать несколько линий, тогда простейшее решение будет считаться только одной строкой за раз. Например:

Dim fName As String = "c:\backup\logs\master.txt" 
Dim wrtFile As String = "c:\backup\logs\masterUserFormatted.txt" 
Dim strRead As New System.IO.StreamReader(fName) 
Dim strWrite As New System.IO.StreamWriter(wrtFile) 
Cursor.Current = Cursors.WaitCursor 
While True 
    Dim line As String = strRead.ReadLine() 
    If line IsNot Nothing Then 
     For Each row As DataGridViewRow In DataGridView1.Rows 
      If Not row.IsNewRow Then 
       Dim Find1 As String = row.Cells(0).Value.ToString 
       Dim Replace1 As String = row.Cells(1).Value.ToString 
       line = line.Replace(Find1, Replace1) 
      End If 
     Next 
     strWrite.WriteLine(line) 
    Else 
     Exit While 
    End If 
End While 
strRead.Close() 
strWrite.Close() 
Cursor.Current = Cursors.Default 
MessageBox.Show("Finished Replacing") 

Стоит отметить, что StreamReader и StreamReader реализации IDisposable. Таким образом, было бы предпочтительнее заключить их в блок Using, а не прямо указывать Close.

+0

Привет, Стив, Большое спасибо за ваш ответ, я обновил и протестировал, но он, похоже, не проходит через находку и заменяет whick более 100k. С уважением, – vbvirg20

+0

@ vbvirg20 Я обновил свой ответ, чтобы включить более полный пример. Дайте мне знать, если у вас все еще есть проблемы. –

+0

Стивен, ты Звезда, спасибо тебе за помощь и твое объяснение, ясно, что мне нужно еще немного поработать над моими петлями. Еще раз спасибо, VBvirg – vbvirg20