powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чтение из большой текстовухи в ListView
10 сообщений из 10, страница 1 из 1
Чтение из большой текстовухи в ListView
    #37594619
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, пример прилагаю, иначе не объяснишь.
Есть список телефонов в столбик.
В тестовом test.txt примерно 21000 записей.
Для чтения текстовухи используется некий класс ClsText, стибренный не помню уже как давно кажется на этом форуме.
Даб не скучно было на это смотреть выводится форма FormProgress, отражающая как движутся дела.
Проблемы две.
1. Процесс все замедляется, замедляется и может сдохнуть где-то после 15000. А на нетестовом более нагруженном графикой и т.п. проекте после 10000. Это если не дышать. Если елозить мышью и т.п. то можно сдохнуть его и побыстрее.
2. По основной форме лучше не "елозить" -можно и завесить. Как минимум будет внешне "не отвечать".

Как оптимизировать это дело с точки зрения красивого восприятия/устойчивости и м.б. скорости?
Что можно сделать?
(FileSystemГлюкоObject не предлагать).

Подчеркну, что если список на 1000-2000 номеров то проблемы/дискомфорт "почти не ощущаются".
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37594632
пример не смотрел

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

2.
кроме того можно на время когда идет добавление элементов в список запретить перерисовку листвью это также очень ускорит процесс

3.
к сожалению бейсика под рукой нет
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37594902
Дмитрий77,

согласен с предыдущим оратором :)

Гуглить по virtual listview, например .
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37594978
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
'проверка что таких данных не существует под другими записями

Это полный ппц, при каждой итерации цикла перебирается весь листвью. Зачем это нужно если используется "key" & str_to_add? При попытке добавить уже существующее значение возникнет ошибка, которую нужно тупо проигнорировать. При большом количестве записей это тоже замедлит заполнение, потому что ошибки будут возникать чаще, но это все равно не идет ни в какое сравнение со сканированием listview.
Так же в коде дофига неоптимизированных текстовых манипуляций.

После всех исправлений заполнение заняло менее 15 секунд.
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37595545
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

похоже Вы правы.

Так нормально? (код ниже)
Поясню:
Особенно
>попытке добавить уже существующее значение возникнет ошибка, которую нужно тупо проигнорировать.
1. If Err.NUMBER = 0 Then
'ListViewSetItemPicture ListPhones, LItem.Index, 0
LItem.SubItems(1) = str_to_add
End If
Иначе перезапишется предыдущий LItem.SubItems(1)
Разумно?

2. Код выделения последнего итема убрал один раз в конец

3. >дофига неоптимизированных текстовых манипуляций.
Я делаю следующее:
1) убираю явно непреемлимые символы: кавычки (' и '') , двоеточие ( : )
Переносы Chr(10) и Chr(13) наверно не надо? Так? Ведь класс читает построчно.
Буквы кстати допустимы (вместо номера телефона допустимо использовать UserName)
2) Убираю Trim() пробелы и {TAB} -главное вначале строки
3) Считаю ограничителем либо пробел, либо {TAB}, либо " ; "
Т.е. телефоном считается первое слово в строчке. Строчка может сожержать дополнительную-ненужную информацию.
Что там можно оптимизировать?

P.S. Ну естественно от абсолютного дурака который подсунет "не список телефонов" здесь защиты быть в принципе не может.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
    For i = 1 To N
        FormProgress.LabelStatus.Caption = "Reading string " & i & " of " & N
        FormProgress.LabelStatus.Refresh
        str_to_add = text.stroka(i)
        str_to_add = tochkaSTR(str_to_add, "'", "")
        str_to_add = tochkaSTR(str_to_add, Chr(34), "")
        str_to_add = tochkaSTR(str_to_add, ":", "")
        str_to_add = tochkaSTR(str_to_add, Chr(10), "")
        str_to_add = tochkaSTR(str_to_add, Chr(13), "")
        str_to_add = Trim(str_to_add)
        If InStr(str_to_add, " ") > 0 Then
            str_to_add = Trim(Left(str_to_add, InStr(str_to_add, " ") - 1))
        End If
        If InStr(str_to_add, Chr(9)) > 0 Then
            str_to_add = Trim(Left(str_to_add, InStr(str_to_add, Chr(9)) - 1))
        End If
        If InStr(str_to_add, ";") > 0 Then
            str_to_add = Trim(Left(str_to_add, InStr(str_to_add, ";") - 1))
        End If
        If Len(str_to_add) > 0 Then
            On Error Resume Next
            SC = ListPhones.ListItems.Count
            Set LItem = ListPhones.ListItems.Add(, "key" & str_to_add, SC + 1)
            If Err.NUMBER = 0 Then
                'ListViewSetItemPicture ListPhones, LItem.Index, 0
                LItem.SubItems(1) = str_to_add
            End If
        End If
'        If i = N Then
'        End If
        FormProgress.IncreasePValue
    Next i
    SC = ListPhones.ListItems.Count
    If SC > 0 Then
        Me.DeSelectAll ListPhones
        ListPhones.ListItems(SC).Selected = True
        ListPhones.ListItems(SC).EnsureVisible
        'ListPhones_Click
    End If
    text.ClearText
    Unload FormProgress
    Me.Enabled = True
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37595923
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Что там можно оптимизировать?Как минимум заменить Left на Left$ и т.д.

Самое лучшее, это выкинуть clsText, считать в текстовую переменную сразу все (тем более, что этот класс и так все загоняет память, но в совершенно диком виде), серией replace или регулярным выражением убрать мусор и разбить (Split) на массив по vbCrLf. Останется только залить его в listview без лишних вывертов.
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37596024
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКак минимум заменить Left на Left$
серией replace
Это я сделал, остальное лениво.
Какая-то "нехилая работа" с ProgressBar должна ж ощущаться (15 сек на 20000 записей уже не плохо), зря чтоль картинки-рюшечки через API рисовал...Компьютер же не задарма электричество кушает, пусть время чуть тратит, показывает чего делает. Да и юзер пусть считает что умная программа интеллектуальной деятельностью занимается.

Вы мне лучше подскажите как сделать чтобы форма в "не отвечает" не переходила пока процесс идет (если мышью елозить).
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37596034
авторВы мне лучше подскажите как сделать чтобы форма в "не отвечает" не переходила пока процесс идет (если мышью елозить).


надо DoEvents поставить в цикле только не каждую итерацию а вызывать через 100 циклов например или мерять интервал времени и по прошествии интервала вызывать скажем каждые 500 мл сек
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37596211
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример не смотрелнадо DoEvents поставить в цикле только не каждую итерацию а вызывать через 100 циклов например
да спасибо, вполне прилично
Код: vbnet
1.
2.
3.
4.
    nn = 0
    For i = 1 To N
        nn = IIf(nn = 100, 1, nn + 1)
        If nn = 100 Then DoEvents



пример не смотрелили мерять интервал времени и по прошествии интервала вызывать скажем каждые 500 мл сек
попытался таймером играться с переменной true/false, но не прокатило, да и бог с ним
...
Рейтинг: 0 / 0
Чтение из большой текстовухи в ListView
    #37596896
Фотография alex77755
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая задача стояла изначально? выбрать уникальные? Так 21000 строк из текстового файла приложенного образца обрабатываются за 2с. Зачем прогрессбар?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чтение из большой текстовухи в ListView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]