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

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

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

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

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

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

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

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

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

После всех исправлений заполнение заняло менее 15 секунд.
...
Рейтинг: 0 / 0
27.12.2011, 16:18
    #37595545
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из большой текстовухи в ListView
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
27.12.2011, 20:12
    #37595923
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из большой текстовухи в ListView
Дмитрий77 Что там можно оптимизировать?Как минимум заменить Left на Left$ и т.д.

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

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


надо DoEvents поставить в цикле только не каждую итерацию а вызывать через 100 циклов например или мерять интервал времени и по прошествии интервала вызывать скажем каждые 500 мл сек
...
Рейтинг: 0 / 0
27.12.2011, 23:21
    #37596211
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из большой текстовухи в ListView
пример не смотрелнадо 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
28.12.2011, 12:43
    #37596896
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из большой текстовухи в ListView
А какая задача стояла изначально? выбрать уникальные? Так 21000 строк из текстового файла приложенного образца обрабатываются за 2с. Зачем прогрессбар?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чтение из большой текстовухи в ListView / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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