【问题标题】:Optimize SQL result to ScreenWriter优化 SQL 结果到 ScreenWriter
【发布时间】:2018-12-12 15:13:45
【问题描述】:

我有一个程序可以读取文件文件夹(总共 4GB),对它们进行索引,然后将它们添加到链接的 SQL 数据库中。这一切都发生在表单甚至加载之前。

现在我希望有另一个文件,每行包含一个 13 位数字,并从 VB 查询 SQL 数据库,搜索每个数字以返回包含该数字的文件夹、文件和行号。

我下面的方法现在有效,但速度很慢。我需要找到一种更快的方法来直接转到文件中的特定行以获取我的号码,并在该位置写入新的文本行。

Dim result = From n In System.IO.File.ReadLines("G:\USER\SearchThese.txt")
                     Select n.Substring(0, 13)


Dim MyFilePath As String
Dim linePos As String
Dim lines As String
'-- connection
Dim con As New SqlConnection(***MY SQL CONNECTION***)

Dim dataset As New DataSet
Dim datatable As DataTable
Dim dataadapter As New SqlDataAdapter
Dim sql As String

Dim i As Integer

'-- command
Dim cmd As New SqlCommand()
con.Open()

Using sw As New StreamWriter("G:\USER\TESTRUN1.txt")
    For Each word As String In result
        i = 0
        sql = ("SELECT * FROM Test_Table WHERE DigNum = @word")
        dataadapter = New SqlDataAdapter(sql, con)
        dataadapter.SelectCommand.Parameters.AddWithValue("@word", word)
        dataset = New DataSet()
        dataadapter.Fill(dataset, "Test_Table")

        While i < dataset.Tables("Test_Table").Rows.Count

            linePos = dataset.Tables("Test_Table").Rows(i).Item(4).ToString()
            MyFilePath = dataset.Tables("Test_Table").Rows(i).Item(1).ToString()
            i += 1
            Using sr As New StreamReader(MyFilePath)
                For n As Integer = 1 To linePos
                    lines = sr.ReadLine
                Next
                sw.WriteLine(lines)
            End Using

        End While


   Next

End Using
MsgBox("Complete!") 

就像我说的那样,这很好用,但即使只搜索 5 个数字也需要相当长的时间。我猜是流式阅读器会减慢它的速度,但我不知道。

对于任何人来说,我的数据库表有这些列:

DigNum | FilPth | FilDte | DteAdd | LnePos

【问题讨论】:

  • 如果文件的内容没有改变(附加的除外),那么您应该考虑将位置存储在文件中。说“读取从位置 23423 开始的行”而不是“读取第 423 行”要容易得多
  • 对不起@the_lotus 觉得我不太明白
  • 你需要调用 ReadLine 直到你到达你想要的那一行。如果您存储了该行的位置(从文件的开头),您可以将Seek 存储到该位置并从那里开始读取。
  • 作为参考,这里是文件的索引方式:stackoverflow.com/questions/53520276/…
  • 这里要记住一件事:将更改写回文件会使我两周前帮助您创建的索引无效。每次更改文件时都必须重新构建索引。

标签: mysql sql vba vb.net seek


【解决方案1】:

在尝试优化这样一段代码的性能时,您需要逐个调用来衡量性能。您可以使用 Visual Studio 的分析工具执行此操作(请参阅:https://docs.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2017

获得这些数据后,您将能够直接查看导致性能问题的原因,而不是猜测。您还将进行测量,因此当您更改代码时,您可以查看性能是提高了还是变差了。这再次消除了过程中的猜测,这很重要,因为现代编译器和系统在幕后做了很多工作来提高性能,但很容易破坏这些优化。

【讨论】:

    【解决方案2】:

    大家好,所以有一个工作,似乎几乎可以立即完美工作。得到了cmets的帮助!

    Using sw As New StreamWriter("G:\USER\TESTRUN1.txt")
                For Each word As String In result
                    i = 0
                    sql = "SELECT * FROM Test_Table WHERE DigNbr = @word"
                    dataadapter = New SqlDataAdapter(sql, con)
                    dataadapter.SelectCommand.Parameters.AddWithValue("@word", word)
                    dataset = New DataSet()
                    dataadapter.Fill(dataset, "Test_Table")
    
                    While i < dataset.Tables("Test_Table").Rows.Count
    
                        linePos = dataset.Tables("Test_Table").Rows(i).Item(4).ToString()
                        MyFilePath = dataset.Tables("Test_Table").Rows(i).Item(1).ToString()
                        i += 1
    
    
                        Using sr As New StreamReader(MyFilePath)
                            sr.BaseStream.Seek(4096 * (linePos - 1), SeekOrigin.Begin)
                            FoundWords.Add(sr.ReadLine)
                            For Each item As String In FoundWords
                                sw.WriteLine(item)
    
                            Next
                            FoundWords.Clear()
                        End Using
    

    对于阅读的人来说,我基本上使用了 seek 方法,每行是 4096 字节,换句话说,每 4097 个新行开始,所以我的行号表明我正在寻找的 13 位数字在哪一行我只是简单地把它加倍,所以搜索直接到那个字节(线)并得到线。

    例如说我是在第 10 行,4096 * 10 是 40960,这是第 10 行的开始。就像 cmets 所说的那样,我基本上不搜索第 55 行,而是搜索位置 (55*4096)。

    我不太擅长解释,但希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-11
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多