优化sql结果到编剧

5gfr0r5j  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(367)

我有一个程序,可以读取一个文件夹中的文件(总共4gb),为它们编制索引,然后将它们添加到链接的sql数据库中。这一切都发生在窗体加载之前。
现在我希望有另一个文件,每行包含一个13位数字,并从vb查询sql数据库,搜索每个数字以返回哪个文件夹、文件和行号包含该数字。
我下面的方法现在起作用了,但是很慢。我需要找到一个更快的方法,直接到我的号码文件中的特定行,并在该位置写一行新的文本。

  1. Dim result = From n In System.IO.File.ReadLines("G:\USER\SearchThese.txt")
  2. Select n.Substring(0, 13)
  3. Dim MyFilePath As String
  4. Dim linePos As String
  5. Dim lines As String
  6. '-- connection
  7. Dim con As New SqlConnection(***MY SQL CONNECTION***)
  8. Dim dataset As New DataSet
  9. Dim datatable As DataTable
  10. Dim dataadapter As New SqlDataAdapter
  11. Dim sql As String
  12. Dim i As Integer
  13. '-- command
  14. Dim cmd As New SqlCommand()
  15. con.Open()
  16. Using sw As New StreamWriter("G:\USER\TESTRUN1.txt")
  17. For Each word As String In result
  18. i = 0
  19. sql = ("SELECT * FROM Test_Table WHERE DigNum = @word")
  20. dataadapter = New SqlDataAdapter(sql, con)
  21. dataadapter.SelectCommand.Parameters.AddWithValue("@word", word)
  22. dataset = New DataSet()
  23. dataadapter.Fill(dataset, "Test_Table")
  24. While i < dataset.Tables("Test_Table").Rows.Count
  25. linePos = dataset.Tables("Test_Table").Rows(i).Item(4).ToString()
  26. MyFilePath = dataset.Tables("Test_Table").Rows(i).Item(1).ToString()
  27. i += 1
  28. Using sr As New StreamReader(MyFilePath)
  29. For n As Integer = 1 To linePos
  30. lines = sr.ReadLine
  31. Next
  32. sw.WriteLine(lines)
  33. End Using
  34. End While
  35. Next
  36. End Using
  37. MsgBox("Complete!")

就像我说的,这很好,但即使只搜索5个数字也需要相当长的时间。我猜是streamreader减慢了速度,但我不知道。
如果有人问我,我的数据库表有以下列:

  1. DigNum | FilPth | FilDte | DteAdd | LnePos
smtd7mpg

smtd7mpg1#

嗨,伙计们,所以有一个工作,似乎工作完美几乎瞬间。能够得到它是由于在评论的帮助!

  1. Using sw As New StreamWriter("G:\USER\TESTRUN1.txt")
  2. For Each word As String In result
  3. i = 0
  4. sql = "SELECT * FROM Test_Table WHERE DigNbr = @word"
  5. dataadapter = New SqlDataAdapter(sql, con)
  6. dataadapter.SelectCommand.Parameters.AddWithValue("@word", word)
  7. dataset = New DataSet()
  8. dataadapter.Fill(dataset, "Test_Table")
  9. While i < dataset.Tables("Test_Table").Rows.Count
  10. linePos = dataset.Tables("Test_Table").Rows(i).Item(4).ToString()
  11. MyFilePath = dataset.Tables("Test_Table").Rows(i).Item(1).ToString()
  12. i += 1
  13. Using sr As New StreamReader(MyFilePath)
  14. sr.BaseStream.Seek(4096 * (linePos - 1), SeekOrigin.Begin)
  15. FoundWords.Add(sr.ReadLine)
  16. For Each item As String In FoundWords
  17. sw.WriteLine(item)
  18. Next
  19. FoundWords.Clear()
  20. End Using

基本上对于任何阅读我使用seek方法的人来说,每一行是4096字节,换句话说,每4097字节有一个新行开始,所以我的行号表示我要找的13位数字在哪一行,我只是简单地将它乘以,这样seek就直接转到那个字节(行)并得到那一行。
e、 假设我在10号线上,409610是40960,这是10号线的起点。就像一个评论说的,我搜索的不是第55行,而是位置(554096)。
我很不善于解释,但希望这能帮助别人。

展开查看全部
5cnsuln7

5cnsuln72#

当试图优化这样一段代码的性能时,您需要逐个调用地度量性能。您可以使用visual studio的分析工具(请参阅:https://docs.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2017)
一旦您有了这些数据,您将能够直接看到是什么导致了性能问题,而不是猜测。您还将进行测量,以便在更改代码时可以看到性能是否有所提高或恶化。这再次消除了过程中的猜测,这一点很重要,因为现代编译器和系统在幕后做了很多工作来提高性能,但很容易破坏这些优化。

相关问题