Загрузка словаря очеееееень долгий процесс, ускорить бы...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Загрузка словаря очеееееень долгий процесс, ускорить бы...

Сообщение Джеффи » 04.05.2005 (Ср) 23:18

Код: Выделить всё

Dim Dictionary() as string
Sub Main
     LoadDic Dictionry(), "dic.txt"
End Sub

Public Sub LoadDic(DicArray() As String, DicFile As String)
Dim splt As String, ss, st As String, sl As String, h As Long, hh As Long
FrmMain.lblmain.Caption = "Открытие словаря..."
DoEvents
ffm = FreeFile
h = 1
Open App.Path & "\Dic\dic.txt" For Input As ffm
    Input #ffm, sl
    ss = Split(sl, " ")
    ReDim DicArray(Val(ss(0))) As String
    Do While EOF(ffm) = False
        Input #ffm, st
        DicArray(h) = st
        If Not st = "" Then h = h + 1:  FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")"
        DoEvents
    Loop
    ReDim Preserve DicArray(h - 2) As String
Close #ffm

FrmMain.lblmain.Caption = "Загружено слов: " & Format(UBound(DicArray), "# ### ###")
DoEvents
GetStatus
End Sub


Вот кусок кода моей программы над которой я сейчас работаю называется "Орфограф", в продробности вдаваться не буду...

Вопрос вот в чём этот код загружает словарь около 2 654 000 слов в динамический массив, но крайне долго около 30 - 40 секунд :D

Конечно не очень долго но поверьте не каждый пользователь захочет столько ждать перед каждым запуском, так и жизнь пройдёт.... :lol:

Вопрос вот в чём как сделать код который делает тоже самое но намного быстрее? :roll:
Может существует более рациональный способ, какая-либо альтернатива? :?

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 04.05.2005 (Ср) 23:39

FleX_2004 писал(а)::):):) вряд ли.... хотя эта тема поднималась не раз.... поисчи....
ss = Split(sl, " ") - вот это очень тормозит процесс.... вроде.. на ночь плохо соображаю.... попробуй без преобразования строк в циклах......


Точно не соображает :lol:

Код: Выделить всё
ss = Split(sl, " ")  ' тут цыкла нет  :lol:
    ReDim DicArray(Val(ss(0))) As String
    Do While EOF(ffm) = False ' а вот тут уже есть   8)
        Input #ffm, st
        DicArray(h) = st
        If Not st = "" Then h = h + 1:  FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")"
        DoEvents
    Loop ' А тут нечего думать Loop он и есть Loop  :wink: 

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Re: Загрузка словаря очеееееень долгий процесс, ускорить бы.

Сообщение Джеффи » 04.05.2005 (Ср) 23:45

Код: Выделить всё

Dim Dictionary() as string
Sub Main
     LoadDic Dictionry(), "dic.txt"
End Sub

Public Sub LoadDic(DicArray() As String, DicFile As String)
Dim splt As String, ss, st As String, sl As String, h As Long, hh As Long
FrmMain.lblmain.Caption = "Открытие словаря..."
DoEvents
ffm = FreeFile
h = 1
Open App.Path & "\Dic\dic.txt" For Input As ffm
    Input #ffm, sl ' Получаем первую строку файла тут хранится количество слов
    ss = Split(sl, " ") ' Разбиваем на массив, так как кроме количества слов там содержится комментарий через пробел
    ReDim DicArray(Val(ss(0))) As String ' Перестраиваем массив под количество слов
    Do While EOF(ffm) = False ' Начинаем открывать
        Input #ffm, st ' Получаем строку
        DicArray(h) = st ' Заносим в массив
        If Not st = "" Then h = h + 1:  FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")" ' Если строка не пустая прибавляем к счётчику 1 и считаем проценты
        DoEvents ' Чтобы проценты отобразились в лейбеле
    Loop
    ReDim Preserve DicArray(h - 2) As String ' Удаляем 2 пунктика (данный кусок кода работает супер быстро я считал с помощью функций GetSystemTime - 2 - 5мс...)
Close #ffm

FrmMain.lblmain.Caption = "Загружено слов: " & Format(UBound(DicArray), "# ### ###") ' Отображаем количество загруженных строк
DoEvents
GetStatus ' И пошла поехала биг прога  8)
End Sub

Для тех кому не понятен код :roll:

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 04.05.2005 (Ср) 23:58

Хм... интересно заменил:
Код: Выделить всё
If Not st = "" Then h = h + 1:  FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")" ' Если строка не пустая прибавляем к счётчику 1 и считаем проценты

на
Код: Выделить всё
If Not st = "" Then h = h + 1

И загрузилось за 13 секунд.... А с этой строчкой 46 секунд...
Почему такая зверская разница :shock:

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 05.05.2005 (Чт) 0:00

Убрал:
Код: Выделить всё
DoEvents ' Чтобы проценты отобразились в лейбеле


И 4 секунды..... :shock: :shock: :shock:

Хм........ 8)

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 05.05.2005 (Чт) 2:03

Джеффи
Основным торможением служило то что ты делал concatenate нa string.
то есть:

FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")"

если очень уж хочется показать юзеру какие то действия, то можно использовать ProgressBar

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 05.05.2005 (Чт) 2:24

val писал(а):Джеффи
Основным торможением служило то что ты делал concatenate нa string.
то есть:

FrmMain.lblmain.Caption = "Открытие словаря... (" & Format(h / Val(ss(0)), "Percent") & ")"

если очень уж хочется показать юзеру какие то действия, то можно использовать ProgressBar


Дизайн моей программы не позволяет использовать прогресс бар.

Тем более я сократил время обработки кода до 4 секунд, я думаю юзер подождёт ведь будет написать "Открытие словаря..." :wink:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.05.2005 (Чт) 7:59

Джеффи писал(а):Тем более я сократил время обработки кода до 4 секунд, я думаю юзер подождёт ведь будет написать "Открытие словаря..." :wink:


Все одно долго.

В частности убери тормоз с показом процентов, а именно убери DoEvents, вставив вместо него lblmain.Refresh. И не надо менять Caption на каждом слове - меняй тогда когда изменились единицы процентов.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 05.05.2005 (Чт) 8:07

Andrey Fedorov писал(а):
Джеффи писал(а):Тем более я сократил время обработки кода до 4 секунд, я думаю юзер подождёт ведь будет написать "Открытие словаря..." :wink:


Все одно долго.

В частности убери тормоз с показом процентов, а именно убери DoEvents, вставив вместо него lblmain.Refresh. И не надо менять Caption на каждом слове - меняй тогда когда изменились единицы процентов.


Я это уже вообще опустил, никаких процентов! :roll:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.05.2005 (Чт) 9:56

Кстати, а ведь самый простой и быстрый способ был бы просто сбрасывать массив на диск как бинарный файл. Недостаток - невозможность править полученный файл ручками.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.05.2005 (Чт) 10:03

Код: Выделить всё
ReDim Preserve DicArray(h - 2) As String

2-4 мс. Оно того стоит?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 10:12

вместо:
Код: Выделить всё

If Not st = "" Then ...


лучше:

Код: Выделить всё
If Len(st)>0 Then ...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.05.2005 (Чт) 10:15

Или даже
Код: Выделить всё
If Len(Trim$(st))>0 Then ...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList