Оптимизировать результат SQL для ScreenWriter - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть программа, которая читает в папке файлов (всего 4 ГБ), индексирует их, а затем добавляет их в связанную базу данных SQL.Все это происходит еще до того, как форма загружается.

Теперь я хочу получить еще один файл, содержащий 13-значное число в каждой строке, и запросить в базе данных SQL из VB поиск каждого номера, чтобы узнать, какая папка, файл и номер строки содержит это число.

Метод, который у меня есть ниже, работает сейчас, но он медленный.Мне нужно найти гораздо более быстрый способ перейти прямо к определенной строке в файле для моего номера и написать новую строку текста в этом месте.

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Привет, ребята, так что один получил работу и, кажется, работает идеально почти мгновенно.Был в состоянии получить его благодаря помощи в комментариях!

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

В основном для любого, кто читал, я использовал метод поиска, каждая строка составляет 4096 байт, поэтому, другими словами, новая строка начинается каждые 4097, так что с моей строкойУ меня есть номер, который указывает, на какой строке находится 13-значный номер, который я ищу, я просто умножаю его, чтобы поиск шел прямо к этому байту (строке) и получал строку.

например, скажем, номер, которым я был, находится в строке 10, 4096 * 10 - это 40960, где начинается строка 10.Как и в одном из комментариев, вместо поиска по строке 55 я в основном ищу позицию (55 * 4096).

Я довольно плохо объясняю, но надеюсь, что это кому-то поможет.

0 голосов
/ 13 декабря 2018

Когда вы пытаетесь оптимизировать производительность в таком фрагменте кода, вам необходимо измерять производительность по вызову.Вы можете сделать это, используя инструменты профилирования Visual Studio (см .: https://docs.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2017)

. Получив эти данные, вы сможете непосредственно увидеть причину проблемы с производительностью, а не угадать ее.изменив код, вы сможете увидеть, улучшилась или ухудшилась производительность. Это опять-таки исключает догадки из процесса, это важно, поскольку современные компиляторы и системы делают многое за кулисами, чтобы улучшить производительность, но эти оптимизации легко сорвать..

...