powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
25 сообщений из 172, страница 5 из 7
Долгая обработка текстовых данных в Экселе
    #36558506
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFЭто не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так.Это не так. Я вставлял этот clsConcat в .net'овский проект, так он проигрывал .net-конкатенации.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558883
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, AndrF, Shocker.Pro, спасибо, на этот раз похоже действительно выручили. Обработка стала гораздо быстрее, в своём роде небольшое чудо. Пока еще не всё попробовал, но уже видны результаты. Я всё-таки был уверен, что если Майкрософт действительно хорошая фирма, то у них это можно как-то сделать :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560381
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг.

И в каком это языке под строковую переменную выделяется фрагментированная память?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560383
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПока еще не всё попробовал, но уже видны результаты.

Если в моем примере функцию ConvS заменить на нижеприведенную, то результаты будут еще в несколько раз лучше...

Код: plaintext
1.
2.
3.
4.
Public Function ConvS(ss As String) As String
    If Len(ss) =  0  Then Exit Function
    ConvS = Replace(Replace(Replace(Replace(Replace(ss, "&", "&"), "'", "'"), """", """), ">", ">"), "<", "<")
End Function
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560385
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFmotorwayПока еще не всё попробовал, но уже видны результаты.

Если в моем примере функцию ConvS заменить на нижеприведенную, то результаты будут еще в несколько раз лучше...

Пардон - код вставился неправильно. Возьмите функцию из собственно приложенного примера.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560521
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFShocker.ProЯ так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг.

И в каком это языке под строковую переменную выделяется фрагментированная память?

не знаю, но это было бы логично для длинных переменных

Опять же, Антонарий говорит, что .NET работает в этом плане лучше, стало быть так наверное там и сделано.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560553
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОпять же, Антонарий говорит, что .NET работает в этом плане лучше, стало быть так наверное там и сделано.

Не так ;) Насколько я знаю выделяемая под переменную память нигде не фрагментируется.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560706
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560803
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.

По сравнению с чем?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560889
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С конкатенацией, тысяча чертей.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560915
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.

Кстати, [q]String[/q] как переменная безусловно нигде не фрагментируется. А вот внутри NET-овского [q]StringBuilder[/q]-a фрагментирование блоками заданного размера возможно - именно за счет этого он и может выдавать большую скорость чем приведенные в ветке варианты на VB6 (так как нет нужды переписывать блоки - достаточно только добавлять). Написать аналогичный класс на VB6 так же вполне возможно, причем без особых проблем.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560928
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС конкатенацией, тысяча чертей.

А попробовать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Sub Main()
        Dim sb As New System.Text.StringBuilder, i As Integer, t As Double, ss As String = ""

        t = Timer
        For i =  1  To  1000000 
            sb.Append(CStr(i))
        Next i
        MsgBox(sb.Length & ",  " & Timer - t)
        '        Debug.WriteLine(sb.Length & ",  " & Timer - t)

        t = Timer
        For i =  1  To  1000000 
            ss += i.ToString
        Next i
        MsgBox(sb.Length & ",  " & Timer - t)

    End Sub

Ну и аналогично можно в VB6. Правда там будет на больших числах заметно большее замедление - надо переделать класс а-ля NET.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561735
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока что мои проблемы не закончились, и битва продолжается. Некоторые процедуры пока выполняются около 30 сек. Пытаюсь ускорить.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561752
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС конкатенацией, тысяча чертей.

Спасибо за код класса, применил у себя, получил ускорение формирования отчета примерно в 10000 раз (правда на отчете за целый год, который обычно не используется).

Обычно пишу в камментах к чужому коду ссылку на источник и автора по возможности... Тебя указывать? :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561933
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ударение на "Тебя", а не на "указывать" [/i]
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562042
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появилась проблема с этим классом. Раньше у меня переменные были как строки, а мне нужно использовать str=Mid(str, 1, Len(str) - 3), и пишет, что не поддерживается такой метод. Как быть?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562051
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПоявилась проблема с этим классом. Раньше у меня переменные были как строки, а мне нужно использовать str=Mid(str, 1, Len(str) - 3), и пишет, что не поддерживается такой метод. Как быть?

Добавьте в метод Append параметр предварительной очистки:
получится типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Sub Append(ByRef nStr As String, Optional PreClear As Boolean = False)
Dim LenStr As Long
    If PreClear Then Class_Initialize
    LenStr = Len(nStr)
    If LenStr =  0  Then Exit Sub
    If (LenTxt + LenStr) > LenBuf Then
        LenBuf = (LenTxt + LenStr) *  2 &
        TxtBuf = TxtBuf & Space$(LenBuf)
    End If
    Mid$(TxtBuf, LenTxt +  1 &) = nStr
    LenTxt = LenTxt + LenStr
End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562053
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно встроить метод Mid прямо в класс.

И в конце-концов через год получится .NET
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562054
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сделал по-другому - нужно было просто писать str.Result, и тогда это воспринимается как строка.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562059
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСпасибо, сделал по-другому - нужно было просто писать str.Result, и тогда это воспринимается как строка.

Ну, разумеется, я думал это проблему не вызывает. Однако, вам же что-то надо решить и с левой частью выражения.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562062
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я присвоил это новой строке с другим именем :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562133
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFА попробовать:
Я говорил про самодельный StringBuilder (которые есть в вашем примере, в моем под именем clsConcat ), а не System.Text.StringBuilder. Сколько повторять?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562140
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так... вот еще одна проблема - загрузка данных в ячейки из файла (данные хранятся в виде строки).
Занимает около 22 сек.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
stack = Readfile("D:/.../stack" & num & ".txt")
List = Split(stack, ":::")

    
For Each l In List
Sheet = Split(l, "~")
sheetname = Sheet( 0 )
znach = Sheet( 1 )
zn = Split(znach, "`")
Set shname = Worksheets(sheetname)
For Each Z In zn
If (Len(Z)) Then
Data = Split(Z, "|")
yach = Data( 0 )
Value = Data( 1 )
shname.Range(yach).Value = Value

End If
Next Z

Next l

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function Readfile(path As String)
Dim TextLine
Open path For Input As # 1  ' Open file.
Do While Not EOF( 1 ) ' Loop until end of file.
Line Input # 1 , TextLine ' Read line into variable.

Loop
Close # 1 
Readfile = TextLine
End Function

Вроде бы ведь до этого получалось ускорить такого рода парсинг, а тут опять тормозит. Можно как-то ускорить это?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562142
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyС конкатенацией, тысяча чертей.

Спасибо за код класса, применил у себя, получил ускорение формирования отчета примерно в 10000 раз (правда на отчете за целый год, который обычно не используется).

Обычно пишу в камментах к чужому коду ссылку на источник и автора по возможности... Тебя указывать? :)Не я его придумал.
Кстати загляни .
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562153
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayТак... вот еще одна проблема - загрузка данных в ячейки из файла (данные хранятся в виде строки).
Откуда нам знать, что в этой строке не стопицот мегабайт и это отличный результат?

motorwayВроде бы ведь до этого получалось ускорить такого рода парсинг, а тут опять тормозит.Так ничему и не научился. Это печально :(
Код: plaintext
Data = Split(Z, "|")
Это что за ерунда? Instr кому давали?
...
Рейтинг: 0 / 0
25 сообщений из 172, страница 5 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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