spamsink: (Default)
[personal profile] spamsink
Есть у меня два файла, почти одинаковой длины, чуть поболее 6 миллионов строк каждый:
% wc -l f*
 6282918 f1.txt
 6287998 f2.txt
Сравним их.
% diff f1.txt f2.txt > diff12
% wc -l diff12
69246 diff12
Слегка так отличаются, чуть больше, чем на процент.
А теперь - наоборот:
% diff f2.txt f1.txt > diff21
% wc -l diff21
6756943 diff21
Я не понимаю, а вы?

Date: 2009-11-23 08:25 pm (UTC)
From: [identity profile] abzac-kakoj-to.livejournal.com
дифф смотрит на первый файл и ищет "соответствующее" место во втором. В первом случае находит, а наоборот у него не получилось. Поэтому он напечатал все строки как находящиеся не на тех местах.

Очевидно, для поиска "соответствующих" строк у него буфер какого-то размера. По-видимому, в одном из файле (f2?) есть подряд большой блок ни с чем не совпадающих строк, заполнивший этот буфер.

Date: 2009-11-23 08:42 pm (UTC)
From: [identity profile] abzac-kakoj-to.livejournal.com
дифф небось написан в 1979 году лично Керниганом. Или кто там был главный.

Date: 2009-11-23 09:15 pm (UTC)
From: [identity profile] iime.livejournal.com
Тогда такого размера файлы, наверное, только в каком-нибудь АДАБАСе были.

Date: 2009-11-23 08:43 pm (UTC)
From: [identity profile] abzac-kakoj-to.livejournal.com
Слово многогигагерцовый прекрасно.

Date: 2009-11-24 02:36 am (UTC)
From: [identity profile] http://users.livejournal.com/_windwalker_/
Можно использовать как скороговорку, аданазначна!

Date: 2009-11-23 08:37 pm (UTC)
From: [identity profile] cema.livejournal.com
Ага, как-то так.

Diff несимметричный.

Date: 2009-11-23 09:55 pm (UTC)
From: [identity profile] mynine.livejournal.com
Хм, а по моему вполне понятно, почему он несимметричный - он смотрит отличия второго от первого, чтобы получить разницу. Смысл париться и вычислять симметричный результат, если все равно он используется несимметрично ? мержить-то отличия можно только с первым файлом...

Date: 2009-11-23 09:42 pm (UTC)
From: [identity profile] sab123.livejournal.com
А посмотреть внутрь этих файлов и найти, в чем несимметричность?

Date: 2009-11-23 10:35 pm (UTC)
From: [identity profile] sab123.livejournal.com
Вообще говоря, тогда все равно непонятно, почему несимметричность. Вот если строки из B встречаются также в A - тогда да. Кстати, сейчас читал man, нашел опцию -d "Change the algorithm to perhaps find a smaller set of changes. This makes diff slower (sometimes much slower)." Может вот он, ответ?

Date: 2009-11-23 11:21 pm (UTC)
From: [identity profile] sab123.livejournal.com
Может это не специально так, а просто глюк?

Date: 2009-11-24 04:08 am (UTC)
From: [identity profile] pkrs.livejournal.com
diff дает набор команд, которые необходимо скормить sed'у, чтобы из первого файла получить второй. Очквидно, что этот набор команд несимметричен.

Если быть совсем точным, то команды для sed'а он выдает, если задать какой-то ключ (не помню какой именно), а без ключа - то же самое, но в более человекочитаемой форме.
From: [identity profile] arno1251.livejournal.com
То есть ты хочешь сказать, что если расстояние Левенштейна есть функция симметричная для строк, то дифф должен быть симметричным для файлов? Имхо все дело в реализации алгоритма. Дифф дает, по сути, последовательность команд для преобразования одного файла в другой, а число строк в результате есть лишь одна из метрик этой последовательности. Даже не самая значащая.
Возможно, не все фишки там учтены. По идее дифф должен прогнать оба варианта, взять из них более короткий и при необходимости инвертировать.
From: [identity profile] arno1251.livejournal.com
Я писал такие модули для баз данных. Там далеко не так все просто. Если размер хеша ограничен (иначе O(n)=n^2), то алгоритм изначально будет ущербным. Я, помню, для СУБД после мильона терзаний соорудил индексно-последовательный третий файл, в который прописал ссылки на оба исходных (за два селекта), а результат получал обработкой за третий проход. Не думаю, что у диффа есть такая возможность, это ведь обычный линейный алгоритм.
From: [identity profile] arno1251.livejournal.com
Возможно, хеш предусмотрен по размеру файла, а вот сопоставление работает с ограничителем.
Мы тут работали с индийскими партнерами, я всякого насмотрелся.
From: [identity profile] cema.livejournal.com
сопоставление работает с ограничителем

Кажется, так.

Date: 2009-11-24 03:52 pm (UTC)
From: [identity profile] dvv.livejournal.com
Скорми диффы patch'у. В обе стороны (а то и во все четыре). Посмотри, что получится.

Date: 2009-11-24 04:00 pm (UTC)
From: [identity profile] dvv.livejournal.com
Что файл1+патч будет эквивалентен файлу2. Или неэквивалентен.

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 5th, 2026 04:19 pm
Powered by Dreamwidth Studios