Страница 1 из 2
					
				Ничего не понимаю!
				Добавлено: 04 Сентябрь 2019, 11:56
				 Алексей- Софт-Центр
				Добрый день!
  Кларион 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-ом!
Алексей
			 
			
					
				Ничего не понимаю!
				Добавлено: 04 Сентябрь 2019, 13:58
				 Yufil
				Get требует одного обращения к индексу, потом одного обращения к БД. 4 записи - 4 обращения. 
А Loop - Next будет лопатить всю базу.  Через Set можно определить порядок чтения записей и установить начальную точку. А дальше может быть прочитано очень много записей.
			 
			
					
				Ничего не понимаю!
				Добавлено: 04 Сентябрь 2019, 15:19
				 Алексей- Софт-Центр
				Добрый день!
  Set - по индексу спозиционировал файл.
 Next  - прочитал  запись в буфер из базы.
    то же одно обращение к базе.
    Почему он (Next) должен читать много записей?
Алексей
			 
			
					
				Ничего не понимаю!
				Добавлено: 04 Сентябрь 2019, 16:35
				 Yufil
				Он много и не читает. Но чуть раньше находится Loop, который пролистает много записей, пока не найдётся нужная . 
Есть смысл запустить трассировку ( утилита 
Clarion\bin\trace.exe ) и посмотреть, что там происходит на самом деле. 
Крайне поучительно  

 
			 
			
					
				Ничего не понимаю!
				Добавлено: 04 Сентябрь 2019, 18:23
				 gopstop2007
				SET(...), что в нем  написано?
если так
Без проблем работает
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 13:36
				 Алексей- Софт-Центр
				Добрый день!
   
SET(...), что в нем написано?
   Так:
  Ключ составной из четырех полей, поэтому:
 clear(fil:record)
  my.field1 = 1
  my.field2 = 2
  my.field3 = 3
 Set(MyfielsKey,MyfielsKey)
Алексей
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 14:33
				 kreator
				Моё понимание - next по индексу должен прочитать четыре записи. Алексей- Софт-Центр, Вы либо set неправильно задаёте, либо из loop выхода вовремя нет. Если какой-нибудь stop поставить под next'ом, какие записи и сколько "фетчатся"?
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 16:03
				 Amike34
				Ключ составной из четырех полей, поэтому:
clear(fil:record)
my.field1 = 1
my.field2 = 2
my.field3 = 3
Set(MyfielsKey,MyfielsKey)
Может ключ испорчен?
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 17:11
				 gopstop2007
				Алексей- Софт-Центр писал(а): 05 Сентябрь 2019, 13:36
  Ключ составной из четырех полей, поэтому:
 clear(fil:record)
  my.field1 = 1
  my.field2 = 2
  my.field3 = 3
 Set(MyfielsKey,MyfielsKey)
Алексей
 
больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 22:37
				 porutchik
				gopstop2007 писал(а): 05 Сентябрь 2019, 17:11больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
 
не замечал. А на счет subj, где то логика хромает...
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
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 05 Сентябрь 2019, 22:42
				 porutchik
				Алексей- Софт-Центр писал(а): 04 Сентябрь 2019, 11:56Всю жизнь считал, что последовательное чтение файла/части файла, должно происходить быстрее, чем чтение тех же записей файла по ключу. 
Элементарная программа: 
В одном файле около 2 000 записей, читаю его последовательно Next-ом.
Типа:
set(...)
loop 
next(a)
 
про логику... Всю жизнь считал, что последовательное чтение файла
loop 
next(a)
а, чтение записей файла по ключу
set(...)
loop 
next(a)
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 06 Сентябрь 2019, 7:42
				 finsoftrz
				gopstop2007 писал(а): 05 Сентябрь 2019, 17:11Алексей- Софт-Центр писал(а): 05 Сентябрь 2019, 13:36
  Ключ составной из четырех полей, поэтому:
 clear(fil:record)
  my.field1 = 1
  my.field2 = 2
  my.field3 = 3
 Set(MyfielsKey,MyfielsKey)
Алексей
 
больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
 
В clarion6 для tps и actian zen все прекрасно работает.
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 06 Сентябрь 2019, 12:56
				 kreator
				gopstop2007 писал(а): 05 Сентябрь 2019, 17:11
больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
 
И я не верю. Может кто-то тест выложить? Я могу на последней версии проверить.
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 06 Сентябрь 2019, 13:15
				 Алексей- Софт-Центр
				Добрый день!
больше 2-х полей не set и get не работает, по крайней мере в С10, сам был недавно удивлен
  по крайней мере get работает в моей задаче
Алексей
 
			 
			
					
				Ничего не понимаю!
				Добавлено: 06 Сентябрь 2019, 17:16
				 vic7tar
				А почему 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, и все отработало за пару ..... СЕКУНД !!!
 
Да не должно быть такого сильного различия. Посмотреть бы код ближе к реальному.