Рейтинг:
0
Garth J Lancaster
+5, приятно
Member 14588284
Начните с выполнения разделения один раз за цикл, а не 11 - Split делает много выделения объектов, поэтому это не быстро.
как я могу это сделать?
OriginalGriff
Вызовите его один раз в верхней части цикла и используйте возвращаемый массив вместо повторного вызова ...
Member 14588284
я ничего не понял :(
OriginalGriff
Чего ты не понимаешь?
Я не пытаюсь быть назойливым или тупым - я получаю только то, что вы печатаете для работы, я не получаю никакого другого контекста.
Member 14588284
я не понимал, как я могу изменить свои коды?
OriginalGriff
Вы знаете, что делает метод разделения, да?
Что он возвращает?
Member 14588284
конечно
но это займет 30 минут
OriginalGriff
О, боже мой ...
Вы знаете, что он делает, вы знаете, что он возвращает.
И вы не можете решить, как использовать это возвращаемое значение?
0x01AA
Небольшая подсказка
Dim splitted_once_per_loop= tx.Split(vbTab)
Dim i= STOK_LIST.Rows.Add ...
OriginalGriff
Я пытаюсь заставить его задействовать свои мозговые клетки ... :смеяться:
Я всегда поражаюсь, что эти ребята могут создавать так много кода, не делая этого вообще ... :вздыхать:
0x01AA
Успокойтесь, он пытается помочь!
Поэтому, если разбиение только один раз за цикл не сильно улучшается, попробуйте далее использовать этот материал "SuspendLayout" и, возможно, также "BeginUpdate"
Member 14588284
он всегда принимает самодовольные позы
0x01AA
Нет, не знает. Прочитайте еще раз все комментарии. Очень трудно понять, пробовали ли вы что-нибудь из его рекомендаций.
OriginalGriff
Я собираюсь уйти от этого дела и оставить его тебе, или я буду груб с ним, а это нечестно...
0x01AA
К вашему сведению: ОП удалил пост, где он был зол.
OriginalGriff
Да, но это не в первый раз - еще в феврале, когда он играл с тем же кодом, он решил, что крик на меня может заставить меня написать его код для него, и я могу вынести обиду с лучшими из них. :смеяться:
Member 14588284
ладно
я сори
Я говорю что не понимаю но он смеется
я начинаю в VBnet
Member 14588284
я говорю всегда, потому что он написал перед всеми членами "идиоты"
https://yadi.sk/i/TwCHrXOX67ehkA
https://www.codeproject.com/Questions/5261795/Get-data-access-with-hour-condititon
Richard Deeming
Если кто-то пишет код с уязвимостью SQL-инъекции, когда он только учится, это нормально. Мы все должны были учиться в какой-то момент.
Если они продолжают писать уязвимый код после того, как более опытный разработчик указал на их ошибку и сказал им, как ее исправить, тогда вполне разумно назвать их идиотами.
И если они собираются возражать более опытному разработчику, пытающемуся помочь им, потому что они не хотят слышать об уязвимостях в своем коде, то я был бы склонен назвать их хуже, чем это! На ум приходят такие слова, как "опасно" и "ответственность"...
Member 14588284
вы знаете все очень много но никто не читает в вашем мозгу
Member 14588284
С STOK_LIST
' Пробовать
.Грядки.Четкий()
Для x = 0 в RichTextBox1.Lines.Отсчет - 1 Шаг 1000
Дим Техас = richtextbox1 отображение.Линии(х).Метод toString.Сплит(vbTab)
Дим я = STOK_LIST.Строк.Добавить
В Резюме Об Ошибке Следующий
Для s = от 0 до 9
.Ряды(я).Ячейки(ы).значение = tx(ы)
Рядом с
Следующий
Конец С
я так изменился
0x01AA
Взгляните на мой последний комментарий к вашему вопросу.
0x01AA
Я только что сделал тест на c# (я не знаю VB.NET). Узким местом, по-видимому, является доступ к RichTextBox.Lines (см. Также мой комментарий к этому вопросу). Если я переберу 35 000 строк из RichtTextBox и получу к ним доступ, это займет некоторое время. Я остановил его примерно через 5 минут.
Если я сначала скопирую строки из RichTextBox следующим образом: "List<string> lns = richTextBox1.Lines.ToList<string>();" Все резко ускоряется. Но к сожалению я не могу помочь ОПУ потому что не знаю VB.NET-да.
И да, все предложения в вашем ответе имеют смысл.
Рейтинг:
0
0x01AA
Пожалуйста, также примите во внимание предложения из решения 1.
Кроме того я думаю что вместо того чтобы обращаться к строкам richtextbox вы должны сначала получить их что то вроде этого:
Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
и продолжайте свою обработку с помощью
textLines
Конечно, вы можете оптимизировать гораздо больше. Вы можете пропустить RichTextBox, реализовав вставку непосредственно из буфера обмена. Кроме того, использование DataTable в качестве хранилища данных вместо DGV может привести к улучшению и также является более чистым.
Я надеюсь, что это поможет, и еще раз, пожалуйста, примите во внимание, что я не знаю VB.NET поэтому обратите внимание на приведенный выше фрагмент кода.
[Edit 1] Простите меня, что я не знаю VB.NET-да. Во всяком случае я попробовал это сделать с ним
Занимает около 15 минут для 35'000 линий (i7/ 3,4 ГГц):
Private Sub ButtonProcessByRTBLines_Click(sender As Object, e As EventArgs) Handles ButtonProcessByRTBLines.Click
Dim len = RichTextBox1.Lines.Count
For i = 0 To len - 1
Dim ln = RichTextBox1.Lines(i)
If i Mod 500 = 0 Then
Label1.Text = i.ToString()
Application.DoEvents()
End If
Next
End Sub
Занимает менее 0,5 секунды для 35'000 строк:
Private Sub ButtonProcessByStringList_Click(sender As Object, e As EventArgs) Handles ButtonProcessByStringList.Click
Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
Dim len = textLines.Count
For i = 0 To len - 1
Dim ln = textLines(i)
If i Mod 500 = 0 Then
Label1.Text = i.ToString()
Application.DoEvents()
End If
Next
End Sub
[Edit 2] наконец, этот неоптимизированный код будет обработан менее чем за 15 секунд. 35'000 линий на i7/ 3,4 ГГц:Private Sub ButtonProcessToDGV_Click(sender As Object, e As EventArgs) Handles ButtonProcessToDGV.Click
Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
Dim textLinesCount = textLines.Count
With STOK_LIST
.Rows.Clear()
For x = 0 To textLinesCount - 1
Dim tx = textLines(x).ToString
If tx <> "" Then
Dim splittedLn = textLines(x).Split(vbTab)
Dim i = STOK_LIST.Rows.Add
Label1.Text = +i
.Rows(i).Cells(0).Value = splittedLn(0)
.Rows(i).Cells(1).Value = splittedLn(1)
.Rows(i).Cells(2).Value = splittedLn(2)
.Rows(i).Cells(3).Value = splittedLn(3)
.Rows(i).Cells(4).Value = splittedLn(4)
.Rows(i).Cells(5).Value = splittedLn(5)
.Rows(i).Cells(6).Value = splittedLn(6)
.Rows(i).Cells(7).Value = splittedLn(7)
.Rows(i).Cells(8).Value = splittedLn(8)
.Rows(i).Cells(9).Value = splittedLn(9)
.Rows(i).Cells(10).Value = splittedLn(10)
End If
If x Mod 500 = 0 Then
Label1.Text = x.ToString()
Application.DoEvents()
End If
Next
End With
End Sub
Member 14588284
еще раз большое спасибо за все.
0x01AA
Вы заметили мою последнюю правку в ответе? Я думаю, что это решит вашу просьбу.