powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Показать задвоенные записи. Срочно!
13 сообщений из 13, страница 1 из 1
Показать задвоенные записи. Срочно!
    #34637937
ALEXPFR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставлена задача:
1) Таблица FILEA.DBF записей 3000000
2) Таблица FILEB.DBF записей 4000000
3) За минимально короткое время (примерно за 1 час работы программы) вывести записи повторяющиеся в FILEB.DBF более 1 раза.

На VFP vers 8 сейчас могу это сделать за 7 часов. Долго!
Может быть кто подскажет быстроходный алгоритм ?
Заранее спасибо.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638010
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALEXPFRПоставлена задача:
1) Таблица FILEA.DBF записей 3000000
2) Таблица FILEB.DBF записей 4000000
3) За минимально короткое время (примерно за 1 час работы программы) вывести записи повторяющиеся в FILEB.DBF более 1 раза.

На VFP vers 8 сейчас могу это сделать за 7 часов. Долго!
Может быть кто подскажет быстроходный алгоритм ?
Заранее спасибо.

Э-э-э, уточняющие вопросы

1. Эти таблички имеют первичные ключи и если ДА, то является ли их совпадение совпадением и в данных.

2. Надо ли сравнивать значения полей для таблички fileb со значениями полей в табличке filea и все ли поля необходимо сравнивать или надо найти дубли только во второй табличке
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638034
ALEXPFR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ключей нетю Голые таблицы.
Сравнить только одно поле в каждой табл. - NOM [ numeric, 9]
Спасибо
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALEXPFR... вывести записи повторяющиеся в FILEB.DBF более 1 раза...А причем тут FILEA.DBF ? Уточни постановку задачи
ALEXPFRКлючей нетю Голые таблицы.
Сравнить только одно поле в каждой табл. - NOM [ numeric, 9]
Спасибо А индекс по NOM есть? если нет, то возможно открыть монопольно и проиндексировать?

При наличии индексов отловить можно в один проход, по времени думаю уложится в несколько минут
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638310
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALEXPFRПоставлена задача:
1) Таблица FILEA.DBF записей 3000000
2) Таблица FILEB.DBF записей 4000000
3) За минимально короткое время (примерно за 1 час работы программы) вывести записи повторяющиеся в FILEB.DBF более 1 раза.

На VFP vers 8 сейчас могу это сделать за 7 часов. Долго!
Может быть кто подскажет быстроходный алгоритм ?
Заранее спасибо.

Либо нужно уточнение задачи, либо первая табличка не нужна, либо задача формулируется так:
вывести из таблицы B те записи которые есть в таблице А, но повторяющиеся в таблице B более одного раза.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE CURSOR fileA (nom n( 9 , 0 ))
INDEX ON nom TAG nom

CREATE CURSOR fileB (nom n( 9 , 0 ))
INDEX ON nom TAG nom

FOR j =  1  TO  3 
	FOR i =  1  TO  100000 
		INSERT INTO fileA VALUES (i)
	ENDFOR 
ENDFOR 

FOR j =  1  TO  4 
	FOR i =  100000  TO  200000 
		INSERT INTO fileB VALUES (i)
	ENDFOR 
ENDFOR 

SELECT * FROM ( ;
SELECT distinct nom FROM fileA) aa ;
inner join ;
(SELECT nom FROM fileB GROUP BY nom HAVING COUNT(nom) >  1 ) bb ;
on aa.nom = bb.nom 
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638371
ALEXPFR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.
Дотумкал. Работает 27 минут.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638437
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALEXPFRСпасибо всем.
Дотумкал. Работает 27 минут.

Вы считаете, что 27 мин - удовлетворительный результат?

Наверное, надо ещё ПоДотумкать.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638608
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist ALEXPFRСпасибо всем.
Дотумкал. Работает 27 минут.

Вы считаете, что 27 мин - удовлетворительный результат?

Наверное, надо ещё ПоДотумкать.

Думаю идеальное время работы измеряется так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
сlose all
lnSec = seconds()
use FILEA order NOM
go top
do while !eof()
   skip
enddo
use FILEB order NOM
go top
do while !eof()
   skip
enddo
? 'Идеальное время: ', seconds() - lnSec
Если тормоза не вызваны сеткой или загрузкой сервера, то должно быть что-то заметно меньшее 27 минут
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34638683
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДумаю идеальное время работы измеряется так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
сlose all
lnSec = seconds()
use FILEA order NOM
go top
do while !eof()
   skip
enddo
use FILEB order NOM
go top
do while !eof()
   skip
enddo
? 'Идеальное время: ', seconds() - lnSec
Если тормоза не вызваны сеткой или загрузкой сервера, то должно быть что-то заметно меньшее 27 минут

Скорее не идеальое а максимально возможное, Вы показали простой перебор, на самом деле Rushmore использует численные алгоритмы поиска, если принять в простом случае метод дихотомии, то поиск из 400000 записей займет 19 шагов.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34639663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistСкорее не идеальое а максимально возможное, Вы показали простой перебор, на самом деле Rushmore использует численные алгоритмы поиска, если принять в простом случае метод дихотомии, то поиск из 400000 записей займет 19 шагов.
То что ты написал - это работа команды SEEK по индексу, а в данном случае надо найти все повторения, а не конкретное значение ключа. Индекс хранит только порядок сортировки, поэтому поиск повторений делается полным перебором таблицы.
Максимально эффективный алгоритм можно построить только перебором. В данном случае надо просто идти в цикле по двум таблицам одновременно, запоминая предыдущее значение ключа для выявления повторений. А то что я в примере показал два цикла, а не один - это для наглядности, на скорость это никак не повлияет, в реальном коде конструкция будет примерно такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
сlose data all
lnSec = seconds()
use FILEA order NOM in  0 
use FILEB order NOM in  0 
go top in FILEA
go top in FILEB
do while !eof('FILEA') and !eof('FILEB')
   if !eof('FILEA')
      skip in FILEA
   endif
   if !eof('FILEB')
      skip in FILEB
   endif
enddo
? 'Идеальное время: ', seconds() - lnSec
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34640663
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tв данном случае надо найти все повторения, а не конкретное значение ключа.

Что бы не быть голословным, напиши тестовый пример на "найти все повторения".

Dima TИндекс хранит только порядок сортировки, поэтому поиск повторений делается полным перебором таблицы

Что-то это для меня новое, если не секрет то какой конкретно индекс реализует ТОЛЬКО такую технологию (а именно порядок сортировки).

Dima Tпоэтому поиск повторений делается полным перебором таблицы

Численные методы поиска как раз и позволяют избежать "тупого" перебора записей.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34641585
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist...
Что бы не быть голословным, напиши тестовый пример на "найти все повторения".

Вот пример (вместо NOM поле NSUM):
Код: plaintext
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
close data all
use zak &&  1   134   952  записи
* делаем два разных файла
if !file('FILEA.dbf')
	copy to FILEA for recno() %  3  !=  0 
endif
sele  0 
use FILEA excl &&  756   117  записей
if tagcount() =  0 
	index on nSum tag nSum
else
	set order to nSum
endif
sele zak
if !file('FILEB.dbf')
	copy to FILEB for recno() %  5  !=  0 
endif
sele  0 
use FILEB excl &&  902   496  записей
if tagcount() =  0 
	index on nSum tag nSum
else
	set order to nSum
endif
****************************************************
? 'Тест 1'
lnSec = seconds()
SELECT aa.nSum FROM ( ;
	SELECT distinct nSum FROM fileA) aa ;
		inner join ;
	(SELECT nSum FROM fileB GROUP BY nSum HAVING COUNT(nSum) >  1 ) bb ;
		on aa.nSum = bb.nSum;
	into cursor res1
? 'Время1: ', seconds() - lnSec &&  6 . 71  сек
****************************************************
? 'Тест 2'
lnSec = seconds()
create cursor res2 (nSum n( 10 , 2 ))
sele FILEA
go top
sele FILEB
go top
lnPrevSumB =  9999999999 
do while .t.
	if FILEA.nSum < FILEB.nSum
		skip in FILEA
		if eof('FILEA')
			exit
		endif
	else
		if FILEB.nSum = lnPrevSumB and FILEA.nSum = FILEB.nSum and res2.nSum != lnPrevSumB
			append Blank in res2
			repl in res2 nSum with lnPrevSumB
		else
			lnPrevSumB = FILEB.nSum
		endif
		skip in FILEB
		if eof('FILEB')
			exit
		endif
	endif
enddo
? 'Время2: ', seconds() - lnSec &&  5 . 90  сек

Ожидал большего. Выигрыш времени 12%, а гемороя написания ... Да и читабельность кода никакая. Так что согласен, оно того не стоит.

PaulWistЧто-то это для меня новое, если не секрет то какой конкретно индекс реализует ТОЛЬКО такую технологию (а именно порядок сортировки). Признаю, неправ, слишком сильно был в этом уверен, что внутрь файла не заглянул. Просто как-то хитро значения ключа храниться: таблица (справочник) 250000 записей, поле с неповторяющимися значениями с(100), индекс по этому полю 7,85 МБ, т.е. в среднем 31.4 байта на 1 запись.
...
Рейтинг: 0 / 0
Показать задвоенные записи. Срочно!
    #34641744
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dima T

Чёта у тебя код написан не правильно, должно работать 27 мин

Сам select можно оптимизировать/переписать.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Показать задвоенные записи. Срочно!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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