Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
MF FAN: Программа для сравнения двух списков на присутствие одинаковых записей
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
20 лет назад / 22 марта 2005 22:58
Привет!

Да, я переворошил Гугл и ваш поиск и не нашел... собсно, проблема заключается в следующем. Объясняю на пальцах. Есть два довольно больших файла (скажем, *.txt), в которых есть строки, разделенные переносом, например:

ФАЙЛ 1:
k09ykj0e4j6yo25
98bgjh40j3g0jg0936
29th9857u056
92387469hrtoiegj
98r7t98q4utoq3t
jrth098jeo546y3
8sg75h
...

ФАЙЛ 2:
dg98j405t205
92387469hrtoiegj
js9g845j923tj0y45y
jh9dr58jy0w5
k09ykj0e4j6yo25
rst8eu45t95
49t8j5
...

Напомню, перенос - это у нас 0x0D 0x0A. Требуется программа, желательно быстрая, которая бы нашла одинаков(ую/ые) строк(у/и) вне зависимости от того, где они находятся. Т.е. результатом работы был бы файлик со следующим содержанием:

k09ykj0e4j6yo25
92387469hrtoiegj
...

Написал простейшую прогу, использующую простейшую идею и стандартные токены:
01BYTE file1[64], file2[64];
02BYTE limit[] = {0x0D, 0x0A, 0x00};
03char * token;
04char * _token;
05DWORD filesize1, filesize2;
06DWORD otmazka;
07DWORD vsego = 0;
08BYTE * pbuffer1, * pbuffer2;
09BYTE * pbuffer;
10HANDLE F1, F2;
11FILE * output;
12 
13printf("input first filename:");
14scanf("%s",&file1);
15printf("input second filename:");
16scanf("%s",&file2);
17F1 = CreateFile((LPCTSTR)file1,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
18F2 = CreateFile((LPCTSTR)file2,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
19filesize1 = GetFileSize(F1,0);
20filesize2 = GetFileSize(F2,0);
21pbuffer = new BYTE[filesize1+1];
22pbuffer1 = new BYTE[filesize1+1];
23pbuffer2 = new BYTE[filesize2+1];
24ReadFile(F1,pbuffer1,filesize1,&otmazka,0);
25ReadFile(F2,pbuffer2,filesize2,&otmazka,0);
26pbuffer1[filesize1]=0x00;
27pbuffer2[filesize2]=0x00;
28CloseHandle(F1);
29CloseHandle(F2);
30memcpy(pbuffer,pbuffer1,filesize1);
31_token = strtok((char *)pbuffer,(const char *)limit);
32while(_token != NULL)
33{
34    _token = strtok(NULL,(const char *)limit);
35    vsego++;
36}
37otmazka = 0;
38output = fopen("out.txt","w+");
39token = strtok((char *)pbuffer1,(const char *)limit);
40while(token != NULL)
41{
42    otmazka++;
43    printf("\r%i of %i",otmazka,vsego);
44    if(strstr((const char *)pbuffer2,token) != NULL)
45    {
46        fprintf(output,"%s\n",token);
47        printf("\n--> %s <--\n",token);
48    }
49    token = strtok(NULL,(const char *)limit);
50}
51fclose(output);
52delete [] pbuffer1;
53delete [] pbuffer2;

прога последовательно расчленяет первый массив на токены (строки) и текущую строку сравнивает со вторым массивом. Использую стандартные strtok и strtok, но она работает крайне медленно и файлы размером всего по 10Мб обрабатывает примерно за полчаса (! а требуется, ну пусть за сутки, но обработать два стомегобайтных файла).

Подскажите плиз что еще пригодно для этих целей! Рассмотрю любые средства, если надо напишу конфертер если форматы будут разницца. Заранее спасибо.
Урукван
unregistered
Ответить
У
Урукван unregistered
20 лет назад / 22 марта 2005 23:48
По-моему это тотал командер ловко делает
mwz
Expert
2704/16069 ответов
23 года на iXBT, с мая 2001
Чаще пишет в "Накопители" (28%)
Россия, Москва
Web-страница
Инфо Ответить
m
mwz Expert
20 лет назад / 23 марта 2005 00:24
MF FAN
файлы размером всего по 10Мб обрабатывает примерно за полчаса (! а требуется, ну пусть за сутки, но обработать два стомегобайтных файла).

Да уж... Алгоритм имеет квадратичную зависимость времени обработки от размера файлов.
AlexL bot
unregistered
Ответить
A
AlexL bot unregistered
20 лет назад / 23 марта 2005 01:59
Это классическая задача под любую реляционную БД.

Access или что есть под рукой.
Загнать данные в текстовые индексированные поля. (Наверно индексировать поле в tab1 не обязательно, проверьте скрость на тестовом наборе)
К примеру таблицы назвать tab1 и tab2, поля и там и там data.

Запрос SELECT tab1.data FROM tab1, tab2 WHERE tab1.data=tab2.data вернет, то что вам требуется.
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
20 лет назад / 23 марта 2005 11:34
mwz
Алгоритм имеет квадратичную зависимость времени обработки от размера файлов.
Знаете, если честно, я просто не хотел вас пугать.... мне нужно сравнить таким образом не два 12 файлов общим размером... ну-у-у-у... Ну в общем я тут придумал оригинальный метод:

Берем Excel и заносим в его первый столбец данные, во втором же столбце напротив каждой записи из первого файла ставим какой-нить идентификатор первого файла, например File 1. И так дописываем далее. Получается примерно следующее:
01zxcvb   file1
02asdfgh  file1
03qwertyu file1
04poiuyt  file1
05lkjhgf  file1
06mnbvc   file1
07dfghjk  file2
08ytrew   file2
09cvbgfd  file2
10rtyui   file2
11nbvcx   file2
12asdfgh  file2
сортируем по первому столбцу и получаем
01asdfgh  file1
02asdfgh  file2
03cvbgfd  file2
04dfghjk  file2
05lkjhgf  file1
06mnbvc   file1
07nbvcx   file2
08poiuyt  file1
09qwertyu file1
10rtyui   file2
11ytrew   file2
12zxcvb   file1
теперь можно написать простейший макрос, который последовательно просмотрит первый столбец и найдет одинаковые, уже рядом стоящие строки такие, что идентификаторы файлов отличаются, и, например, поставит около них какую-нить текстовую закорючку:
01asdfgh  file1   *
02asdfgh  file2   *
03cvbgfd  file2  
04dfghjk  file2  
05lkjhgf  file1  
06mnbvc   file1  
07nbvcx   file2  
08poiuyt  file1  
09qwertyu file1  
10rtyui   file2  
11ytrew   file2  
12zxcvb   file1  
воть.
mwz
Expert
2707/16074 ответов
23 года на iXBT, с мая 2001
Чаще пишет в "Накопители" (28%)
Россия, Москва
Web-страница
Инфо Ответить
m
mwz Expert
20 лет назад / 23 марта 2005 12:21
MF FAN
Берем Excel и заносим в его первый столбец данные, во втором же столбце напротив каждой записи из первого файла ставим какой-нить идентификатор первого файла, например File 1. И так дописываем далее. Получается примерно следующее

Для ускорения работы -- как вариант:
Если файлы текстовые -- в Ворде можно преобразовать текст в таблицу (одна колонка), и скопировать эту таблицу в Эксель начиная с нужного места.

Во второй колонке Excel ввести первое File1, затем расширить это слово на нужную часть столбца, протянув нижний правый угол этой ячейки вниз при удерживаемой клавише Ctrl.
Ram-Time
Member
33/1157 ответов
22 года на iXBT, с июля 2002
Чаще пишет в "Общий" (19%)
Инфо Ответить
R
Ram-Time Member
20 лет назад / 23 марта 2005 12:29
А хешировать строки и искать по хешу?
ZAlex
Member
96/2358 ответов
24 года на iXBT, с июня 2000
Чаще пишет в "Администрирование" (32%)
Инфо Ответить
Z
ZAlex Member
20 лет назад / 23 марта 2005 12:45
Берем Excel и заносим в его первый столбец данные
При этом не забываем про ограничение на кол-во строк в Excel (65536 строк ).....
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
20 лет назад / 23 марта 2005 13:27
Не обижайтесь, но ИМХО судя по ответам эксперта надо дать Ram-Time или ZAlex, а не mwz. Да, я знаю как пользоваться Excel. Есть другая идея - написать хороший хешер... Но на это надо время а мне надо действовать максимально быстро.
Урукван вы не так поняли проблему - строки могут быть где угодно в файле.
~wildwind~
Member
37/609 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 23 марта 2005 15:06
MF FAN
Проблему действительно нужно уточнить. Итак, имеем на входе ~12 текстовых файлов ~100 Мб каждый. Требуется сформировать выходной файл, содержащий строки, присутствующие во всех исходных, в любом месте. Правильно?

Есть идея использовать метод, который в Oracle называется merge-join. Конечно более эффективен был бы hash-join (то что предложил Ram-Time), но правильно реализовать его на коленке за полчаса IMHO не удастся. Как это делается: вначале сортируем исходные файлы, затем фильтруем с помощью JScript.
Но прежде чем это делать, надо бы оценить эффективность такого подхода. Для этого нужны такие данные (или хотя бы приблизительные оценки):

- количество строк во входных файлах и соответственно средняя длина строк;
- ожидаемое количество строк в выходном файле;
- объем доступной памяти
- время за которое один файл сортируется стандартной sort (имена вх. и вых. файлов указать явно в ключах, а не через конвейер)
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
20 лет назад / 23 марта 2005 19:49
~wildwind~
итак. на вход будут поданы 12 файлов размером по 89 метров каждый. в каждом файле 6 500 000 двенадцатибайтных строк типа:

4tcja06jv52n
984u6089w3
e56oph7jd05
0s93wj457gf

и т.д...
требуется сформировать выходной файл, содержащий строки. причем строка уже попадает туда, если она содержится хотя бы двух файлах В ЛЮБОМ МЕСТЕ файлов.
AlexL
Member
153/972 ответов
23 года на iXBT, с января 2002
Чаще пишет в "OС и сист. ПО" (19%)
Инфо Ответить
A
AlexL Member
20 лет назад / 26 марта 2005 11:59
MF FAN
Hi, всё ещё актуально?
Все тривиально решается при помощи GNU sort и uniq. На системе с 512M памяти общее время до 2 часов.
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
20 лет назад / 27 марта 2005 00:06
Следующее задание - выкинуть из всех двенадцати файлов все строчки, в которые есть символы i, j, m, w. Как это сделать проще?
AlexL
Member
156/978 ответов
23 года на iXBT, с января 2002
Чаще пишет в "OС и сист. ПО" (19%)
Инфо Ответить
A
AlexL Member
20 лет назад / 27 марта 2005 00:53
Опять таки гну.
grep -v -h -e [ijmw] 01.txt >filtered01.txt

У борландовского grep нет ключа -h (подавление заголовка на выходе).

Добавление от 27.03.2005 00:57:

Я про Access ляпнул, как-то не подумав об объемах...
~wildwind~
Member
38/615 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 28 марта 2005 13:30
AlexL
Все тривиально решается при помощи GNU sort и uniq
Предлагаешь объединить все файлы в один гигабайтный и применить к нему sort и uniq? Не очень-то тривиально, если допустить, что в исходных файлах могут быть дубли. Придется вначале проделать ту же процедуру с каждым в отдельности.

MF FAN
Следующее задание
Что за задания, интересно? Лабы по Юниксу?
MF FAN
unregistered
Автор темы
Ответить
M
MF FAN unregistered Автор темы
  20 лет назад / 28 марта 2005 14:27
AlexL
Актуально! Но ГНУ у меня нема...

~wildwind~
нет, не лабораторные..... просто если скажу для чего это надо - будете смеяться.... могу лишь чуть-чуть намекнуть.... это нужно для графики
~wildwind~
Member
40/617 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 28 марта 2005 15:48
MF FAN
GNU CoreUtils берется отсюда: http://sourceforge.net/projects/gnuwin32/. Но морока еще та IMHO. Блин, написал бы скрипт для слияния n файлов, да времени нет.

если скажу для чего это надо - будете смеяться.... это нужно для графики
Уже смешно. Сказал бы еще - "это нужно для жизни".
Matra-Man
Member
45/807 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "OС и сист. ПО" (53%)
Беларусь, Минск
Инфо Ответить
Matra-Man Member
20 лет назад / 28 марта 2005 19:39
Всё уже написано до нас Не проверял, правда на больших файлах.
Задание 1:
findstr /l /x /g:file1.txt file2.txt

Задание 2:
findstr /v [ijmv] file.txt > new_file.txt
~wildwind~
Member
41/619 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 28 марта 2005 19:57
Matra-Man
Не проверял, правда на больших файлах
Ты бы хоть в суть задачи вник.
Matra-Man
Member
47/809 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "OС и сист. ПО" (53%)
Беларусь, Минск
Инфо Ответить
Matra-Man Member
20 лет назад / 28 марта 2005 20:30
~wildwind~
Ты бы хоть в суть задачи вник.
На производительность намекаешь? А я про неё и не говорил. Спросили как сделать - я написал как. Точка.
~wildwind~
Member
42/620 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 28 марта 2005 21:13

Matra-Man
На производительность намекаешь?
Не только. Прочти ветку целиком. После уточнения задача стала сложнее.
AlexL
Member
157/979 ответов
23 года на iXBT, с января 2002
Чаще пишет в "OС и сист. ПО" (19%)
Инфо Ответить
A
AlexL Member
20 лет назад / 29 марта 2005 02:42
MF FAN
Я использовал эти порты http://unxutils.sourceforge.net/ попались просто первыми и не требуют cygwin.

1. Сортировка.
sort.exe -k1,12 -S350M -u 01.txt -os01.txt
-k1,12 - необязательно если данные чистые. У меня в тестовом наборе, в каждой строке было дописано имя файла (для отладки).
-S350M - выделение памяти, вроде не обязательно, не знаю как оно ее по умолчанию берет.
-u - исключить дубли внутри файла, это если необходимо.
-os01.txt - выходной файл s01.txt

2. Слияние файлов.
sort.exe -m -k1,12 -S350M s01.txt s02.txt . . . -osorted.txt
-m - полагать исходные файлы сортированными, быстрее работает.
s01.txt s02.txt . . . - список всех 12 уже отсортированных (и отфильтрованных если нужно) файлов.

3. Поиск дублей.
uniq -d -w12 sorted.txt out.txt
-d - выводить только дубли.
-w12 - сравнивать только 12 знаков. Это из-за моих доп. данных в строке.
out.txt - содержит список дублей.

~wildwind~
Я не поленился нагенерить файлы и проверить. У меня на sempron 2500+ 512 ram вышло на все первое задание немного больше часа. Под sort выделял 350Мб памяти.

Предлагаешь объединить все файлы в один гигабайтный и применить к нему sort и uniq? Не очень-то тривиально, если допустить, что в исходных файлах могут быть дубли. Придется вначале проделать ту же процедуру с каждым в отдельности.

Я предлагаю:
1. По отдельность сортировать файлы. Если нужно исключить дубли внутри файла (sort умеет).
2. Слить отсортированное в один файл при помощи sort. (У сорта есть опция merge, которая полагает, что входные файл уже отсортированы, поэтому работае сравнительно быстро на таком объёме)
3. На сортированных данных поиск дублей - детская задача. uniq просто под рукой оказался.

Matra-Man
Задание 1:
findstr /l /x /g:file1.txt file2.txt

Для файлов двух да. А для 12?
На моем компьютере получиться 8-10 часов (Sum(i) i=[1..11] = 66 запусков)
~wildwind~
Member
43/621 ответов
21 год на iXBT, с февраля 2004
Чаще пишет в "OС и сист. ПО" (26%)
Россия, Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР…
Инфо Ответить
w
~wildwind~ Member
20 лет назад / 29 марта 2005 11:16
AlexL
Я предлагаю:
Да, нормальное решение. Правда требуется временный файл в 1 Гб, но это несущественно.
Matra-Man
Member
49/811 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "OС и сист. ПО" (53%)
Беларусь, Минск
Инфо Ответить
Matra-Man Member
20 лет назад / 29 марта 2005 12:38
~wildwind~
AlexL
Упс... Действительно пропустил уточнение. Встроенными средствами cmd сделать можно, но это будет уже катастрофически долго.
AlexL
Member
158/980 ответов
23 года на iXBT, с января 2002
Чаще пишет в "OС и сист. ПО" (19%)
Инфо Ответить
A
AlexL Member
20 лет назад / 30 марта 2005 01:51
То, что я описал - решение для непрограммиста.
Даже при небольшом опыте программирования (реальных задач), это вполне решаемо и может даже быстрее по суммарному времени. Обсчет точно будет быстрее.
К примеру, данные представлять не в виде строк, а 12-ти байтного целого, - громадное увеличение скорости сортировки и поиска.
Если на этих же данных предполагается исключение некоторых строк ([ijmw]), то решаемо во время конвертации данных, и я уверен будет быстрее, чем использование предложенных регулярных выражений.
Ваш ответ:

Нет значка Нет значка Вот тут! Лампочка Восклицание Вопрос Класс! Улыбка Злость Огорчение Поговорим? Краснею Подмигивание Ругаю ОдобряюBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).