Сравнение двух файлов

stanlee

Новичок
Сравнение двух файлов

есть два 5 метровых файла
задача добавить в базу то что является разницей между ними

когда файлы были меговыми я просто загружал их оба в массивы и сравнивал массивы
но с их увеличением задумываюсь о смене алгоритма

как лучше подойти к такой задаче?
 

Fortop

Новичок
Ммм, ну при том же алгоритме, можно просто читать их построчно
[m]fgets[/m]

А файлы обязательно должны быть 5мб? :) может сделать что-то вроде ротации? Или разрезать их на части как-то?
 

stanlee

Новичок
файлы постепенно разрастаются

если порезать - вдруг искомая часть будет в другом файле?

а если читать построчно то я сравниваю 2 строки а не все
как тогда я узнаю где у меня изменение?
 

Fortop

Новичок
а если читать построчно то я сравниваю 2 строки а не все
как тогда я узнаю где у меня изменение?
Омг, а как же тогда сравнивались массивы?

если порезать - вдруг искомая часть будет в другом файле?
Почему? Я так понимаю есть два файла, в них дописывается информация. Верно?

Она дописывается в конец? Или в произвольное место файла?
 

stanlee

Новичок
Омг, а как же тогда сравнивались массивы?
с помощью file и array_diff, когда файлы небольшие это наилучший вариант

я тоже думал в конец
оказалось произвольно, что и усложнило задачу
 

Fortop

Новичок
с помощью file и array_diff,
Понятно.
ну, можно просто читать строчку и искать ее в другом файле.
И так для всех строк. Это медленнее, но экономится память.

А можно попробовать воспользоваться утилитами типа diff

Какую оптимальность ищем? Меньше памяти? Быстрее?
 

AmdY

Пью пиво
Команда форума
зачем придумывать велосипед, если можно вызвать консольный diff
 

stanlee

Новичок
при построчном считывании память да сэкономится
но это тоже временное решение
тк мы сравниваем файла и 1 файл должен быть в памяти весь

или предлагаешь считывать одну строку первого файла и прогонять ее по второму и так далее?

это вобще экономично, но долго, тут уже другая проблема - файл разрастется и я выйду за рамки max_execution_time

diff вот смотрю, но он сравнивает не 2 массива похоже, а 2 файла с мелкими расхождениями, те он заметит если добавление будет идти в начале и в конце, но если хаотичное, то толку от него не будет
 

Fortop

Новичок
тк мы сравниваем файла и 1 файл должен быть в памяти весь
Не должен.
Мы можем за счет увеличения операций чтения читать его построчно -надцать раз. Вопрос нужно ли это?

или предлагаешь считывать одну строку первого файла и прогонять ее по второму и так далее?
Да.Это один из вариантов. Не самый лучший, но самый экономный по памяти.

diff вот смотрю, но он сравнивает не 2 массива похоже, а 2 файла с мелкими расхождениями, те он заметит если добавление будет идти в начале и в конце, но если хаотичное, то толку от него не будет
Чего вдруг?
 

stanlee

Новичок
я создал 2 тестовых файла

старый
PHP:
1
2
3
4
5
6
7
8
9
10
и новый
PHP:
1
10
5
3
8
77
33
2
344
12
6
4
7
23
9
запускаем diff -n старый новый
и получаем хрень

а должен

PHP:
77
33
344
12
23
или я чего то не так делаю?
 

Fortop

Новичок
Мда, мало того что вставка произошла, так еще и пересортировались линии.

Натрави для начала sort на файлы. Потом сравнивай.

-~{}~ 14.03.10 17:56:

Код:
fortop@linux-jf1s:~/work/test> sort s1.txt > so1.txt                 
fortop@linux-jf1s:~/work/test> sort s2.txt > so2.txt
fortop@linux-jf1s:~/work/test> diff -n so1.txt so2.txt
d2 1
a2 2
10
12
a3 1
23
a4 2
33
344
a8 1
77
d10 1
a10 1
9
fortop@linux-jf1s:~/work/test>
 

stanlee

Новичок
косяк еще оказался, что сменили чуток тип строки
и диф не мог сравнить
теперь все встало на свои места, спасибо всем
 
Сверху