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

  • Автор темы Автор темы stanlee
  • Дата начала Дата начала

stanlee

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

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

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

как лучше подойти к такой задаче?
 
Ммм, ну при том же алгоритме, можно просто читать их построчно
[m]fgets[/m]

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

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

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

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

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

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

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

Какую оптимальность ищем? Меньше памяти? Быстрее?
 
зачем придумывать велосипед, если можно вызвать консольный diff
 
при построчном считывании память да сэкономится
но это тоже временное решение
тк мы сравниваем файла и 1 файл должен быть в памяти весь

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

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

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

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

diff вот смотрю, но он сравнивает не 2 массива похоже, а 2 файла с мелкими расхождениями, те он заметит если добавление будет идти в начале и в конце, но если хаотичное, то толку от него не будет
Чего вдруг?
 
я создал 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

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

Натрави для начала 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>
 
косяк еще оказался, что сменили чуток тип строки
и диф не мог сравнить
теперь все встало на свои места, спасибо всем
 
Сверху