Ничего не понимаю!
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Ничего не понимаю!
Добрый день!
Кларион 10. Windows 7. Файлы TPS.
(но, думаю не в этом суть)
Всю жизнь считал, что последовательное чтение файла/части файла, должно происходить быстрее, чем чтение тех же записей файла по ключу.
Элементарная программа:
В одном файле около 2 000 записей, читаю его последовательно Next-ом.
Типа:
set(...)
loop
next(a)
Read_B_File
....
end
Read_B_File - процедура, устанавливающая SET-ом В-файл (около 100 000 записей) и Next-ом читающая всегда 4 (Это я знаю) записи.
Типа:
Set(...)
loop
next(b)
if error() then break.
if условие then break.
....
end
По времени, на разных компах, эта программа отрабатывает от 5 до 10 минут.
Заменил в процедуре Read_B_File цикл с NEXT на 4 GET-a, и все отработало за пару ..... СЕКУНД !!!
Чем я только не пытался ускорить Next-вариант и STREAM, и BUFFER, ничего не помогло!
Для меня это откровение, что GET-ы , читающие 4-е последовательные записи работают быстрее, чем последовательное чтение NEXT-ом!
Алексей
Кларион 10. Windows 7. Файлы TPS.
(но, думаю не в этом суть)
Всю жизнь считал, что последовательное чтение файла/части файла, должно происходить быстрее, чем чтение тех же записей файла по ключу.
Элементарная программа:
В одном файле около 2 000 записей, читаю его последовательно Next-ом.
Типа:
set(...)
loop
next(a)
Read_B_File
....
end
Read_B_File - процедура, устанавливающая SET-ом В-файл (около 100 000 записей) и Next-ом читающая всегда 4 (Это я знаю) записи.
Типа:
Set(...)
loop
next(b)
if error() then break.
if условие then break.
....
end
По времени, на разных компах, эта программа отрабатывает от 5 до 10 минут.
Заменил в процедуре Read_B_File цикл с NEXT на 4 GET-a, и все отработало за пару ..... СЕКУНД !!!
Чем я только не пытался ускорить Next-вариант и STREAM, и BUFFER, ничего не помогло!
Для меня это откровение, что GET-ы , читающие 4-е последовательные записи работают быстрее, чем последовательное чтение NEXT-ом!
Алексей
Ничего не понимаю!
Get требует одного обращения к индексу, потом одного обращения к БД. 4 записи - 4 обращения.
А Loop - Next будет лопатить всю базу. Через Set можно определить порядок чтения записей и установить начальную точку. А дальше может быть прочитано очень много записей.
А Loop - Next будет лопатить всю базу. Через Set можно определить порядок чтения записей и установить начальную точку. А дальше может быть прочитано очень много записей.
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Ничего не понимаю!
Добрый день!
Set - по индексу спозиционировал файл.
Next - прочитал запись в буфер из базы.
то же одно обращение к базе.
Почему он (Next) должен читать много записей?
Алексей
Set - по индексу спозиционировал файл.
Next - прочитал запись в буфер из базы.
то же одно обращение к базе.
Почему он (Next) должен читать много записей?
Алексей
Ничего не понимаю!
Он много и не читает. Но чуть раньше находится Loop, который пролистает много записей, пока не найдётся нужная .
Есть смысл запустить трассировку ( утилита Clarion\bin\trace.exe ) и посмотреть, что там происходит на самом деле.
Крайне поучительно
Есть смысл запустить трассировку ( утилита Clarion\bin\trace.exe ) и посмотреть, что там происходит на самом деле.
Крайне поучительно
-
- ✯ Ветеран ✯
- Сообщения: 1702
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Ничего не понимаю!
SET(...), что в нем написано?
если так
Код: Выделить всё
my.field = 4
SET(Myfile,MyfielsKey)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Ничего не понимаю!
Добрый день!
Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
Алексей
Так:SET(...), что в нем написано?
Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
Алексей
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Ничего не понимаю!
Моё понимание - next по индексу должен прочитать четыре записи. Алексей- Софт-Центр, Вы либо set неправильно задаёте, либо из loop выхода вовремя нет. Если какой-нибудь stop поставить под next'ом, какие записи и сколько "фетчатся"?
We are hard at work… for you.
Ничего не понимаю!
Может ключ испорчен?Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
-
- ✯ Ветеран ✯
- Сообщения: 1702
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Ничего не понимаю!
больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивленАлексей- Софт-Центр писал(а): ↑05 Сентябрь 2019, 13:36 Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
Алексей
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ничего не понимаю!
не замечал. А на счет subj, где то логика хромает...gopstop2007 писал(а): ↑05 Сентябрь 2019, 17:11больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
разве не:gopstop2007 писал(а): ↑05 Сентябрь 2019, 17:11clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
clear(MyfielsKey:record)
MyfielsKey.field1 = 1
MyfielsKey.field2 = 2
MyfielsKey.field3 = 3
Set(MyfielsKey,MyfielsKey)
LOOP
и здесь где-то
IF MyfielsKey.field4 = ... CYCLE
Чтоб приблизится к GET
Ничего не понимаю!
про логику... Всю жизнь считал, что последовательное чтение файлаАлексей- Софт-Центр писал(а): ↑04 Сентябрь 2019, 11:56Всю жизнь считал, что последовательное чтение файла/части файла, должно происходить быстрее, чем чтение тех же записей файла по ключу.
Элементарная программа:
В одном файле около 2 000 записей, читаю его последовательно Next-ом.
Типа:
set(...)
loop
next(a)
loop
next(a)
а, чтение записей файла по ключу
set(...)
loop
next(a)
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4618
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Ничего не понимаю!
В clarion6 для tps и actian zen все прекрасно работает.gopstop2007 писал(а): ↑05 Сентябрь 2019, 17:11больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивленАлексей- Софт-Центр писал(а): ↑05 Сентябрь 2019, 13:36 Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
Алексей
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Ничего не понимаю!
И я не верю. Может кто-то тест выложить? Я могу на последней версии проверить.gopstop2007 писал(а): ↑05 Сентябрь 2019, 17:11 больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
We are hard at work… for you.
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Ничего не понимаю!
Добрый день!
Алексей
по крайней мере get работает в моей задачебольше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
Алексей
Ничего не понимаю!
А почему 2 поля? Да хотя два десятка, вот небольшой примерчик:
Код: Выделить всё
Program
Map.
Test File, Driver('topspeed'), Pre(t), Create, Thread, Name('test.tps')
fKey key(t:f1, t:f2, t:f3), Nocase, Opt, Primary
fRec Record, Pre()
f1 Long
f2 String(1)
f3 Long
f4 Long..
Code
Create(Test)
Open(Test)
Set(Test)
Loop i# = 1 to 10
t:f1 = i#
t:f2 = Chr(64 + i#)
t:f3 = i# + 10
t:f4 = i# + 100
Add(Test)
end
t:f1 = 4
t:f2 = 'D'
t:f3 = 14
Set(t:fKey, t:fKey)
Next(Test)
Message('t:f4 (next) = ' & Format(t:f4, @N_7)) ! t:f4 = 104
t:f1 = 5
t:f2 = 'E'
t:f3 = 15
Get(Test, t:fKey)
Message('t:f4 (get) = ' & Format(t:f4, @N_7)) ! t:f4 = 105
Да не должно быть такого сильного различия. Посмотреть бы код ближе к реальному.Алексей- Софт-Центр писал(а): ↑04 Сентябрь 2019, 11:56Заменил в процедуре Read_B_File цикл с NEXT на 4 GET-a, и все отработало за пару ..... СЕКУНД !!!
C10, Win10x64