我的 vb.net 应用程序读取txt文件"out of memory"有时出现错误



我的应用程序正在从目录中读取文本文件(只有几行,文本文件大小约为60GB,因为目录中的测试总文件为53个文件(,并循环所有文件。我想知道是否有任何管理层需要处理关闭或在阅读后对其做些什么?。代码的关注部分低于

For Each i As String In ListBox1.Items
TextBox2.Text = TextBox1.Text & "" & (i).ToString
Dim lineCount = IO.File.ReadLines(TextBox2.Text).Count()
Dim Counter As String = System.IO.File.ReadAllLines(TextBox2.Text)(lineCount - 2)
TextBox3.Text = Counter
DataGridView1.Rows.Add((i).ToString, System.IO.File.ReadAllLines(TextBox2.Text)(11), "Back Up", "Complete", "100%", System.IO.File.ReadAllLines(TextBox2.Text)(5), Counter, System.IO.File.ReadAllLines(TextBox2.Text)(lineCount - 7).Substring(0, 21), System.IO.File.ReadAllLines(TextBox2.Text)(lineCount - 8).Substring(0, 21))

或者,如果有人有任何建议,我们将不胜感激。

一个问题是,您调用ReadAllLines的次数达到了惊人的六次

  1. 一次获取计数
  2. 一次获得倒数第二行
  3. 一次将第12行添加到DataGridView
  4. 一次将第6行添加到DataGridView
  5. 一次将倒数第8行添加到DataGridView
  6. 一次将倒数第9行添加到DataGridView

这是一种代码气味。我的第一个建议是只调用该方法一次,将结果存储在变量中,然后在需要时引用它。

我还建议使用一些数据验证。如果你试图访问一条不存在的线路,或者试图获取不存在的部分线路,该怎么办?现在它会抛出一个异常。

最后,在我的示例中,我将对单元格值进行拆分。在我看来,这只会让阅读/调试变得更容易。然而,如果你想让他们都像现在这样排成一行,那也没关系。

TextBox2.Text = IO.Path.Combine(TextBox1.Text, i.ToString())
Dim lines = IO.File.ReadLines(TextBox2.Text)
Dim lineCount = lines.Length
Dim counter As String = If(lineCount > 2, lines(lineCount - 2), String.Empty)
TextBox3.Text = counter
Dim cell1 = i.ToString()
Dim cell2 = If(lines.Length > 11, lines(11), String.Empty)
Dim cell3 = "Back Up"
Dim cell4 = "Complete"
Dim cell5 = "100%"
Dim cell6 = If(lines.Length > 5, lines(5), String.Empty)
Dim cell7 = counter
Dim cell8 = If(lines.Length > lineCount - 7, lines(lineCount - 7), String.Empty)
If (cell8.Length > 20) Then
cell8 = cell8.Substring(0, 21)
End If
Dim cell9 = If(lines.Length > lineCount - 8, lines(lineCount - 8, String.Empty)
If (cell9.Length > 20) Then
cell9 = cell9.Substring(0, 21)
End If
DataGridView1.Rows.Add(cell1, cell2, cell3, cell4, cell5, cell6, cell7, cell8, cell9)

如果性能仍然是一个问题,那么您可以修改该方法,改为使用ReadLines方法。这不会导致代码一次性读取整个文件。根据文件:

ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合。使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您使用非常大的文件时,ReadLines可以更高效。

最新更新