Сравнение больших текстовых файлов. Является ли сравнение хэшей быстрее, чем использование подмножеств файла? - PullRequest
1 голос
/ 06 октября 2011

Скажем, у меня есть два больших (текстовых) файла, которые якобы идентичны, но я хочу убедиться. Вся серия Гарри Поттера для взрослых и детей, возможно ...

Если полнотекстовое строковое представление слишком велико для одновременного хранения в памяти, будет ли оно быстрее:

  • a) Хешировать оба файла целиком, а затем проверить, идентичны ли хеши

или

  • b) Читайте управляемые куски каждого файла и сравнивайте их, пока не достигнете EOF или не найдете несоответствие

Другими словами, будет ли удобство сравнения 2 маленьких хешей компенсировано временем, которое потребовалось для генерации указанных хешей?

Я ожидаю пару ответов "это зависит", поэтому, если вы хотите, чтобы с некоторыми предположениями поработало:

  • Язык C # в .NET
  • Текстовые файлы по 3 ГБ
  • Функция хеширования MD5
  • Максимальная «запасная» оперативная память составляет 1 ГБ

Ответы [ 3 ]

3 голосов
/ 06 октября 2011
  1. Контрольная сумма MD5 будет медленнее, так как вам нужно обработать два файла, чтобы получить результат.Вы говорите, что у вас есть 3 ГБ файлов и только 1 ГБ свободной памяти вы делаете математику.

  2. Проверка их в байтовых чанках фактически определит любую разницу раньше, также, проверяя размер файла, длину файлаи т.д. ...

Я бы выбрал вариант 2.

2 голосов
/ 06 октября 2011

Опция A полезна только в том случае, если вы повторно используете хеш (т.е. имеете другие файлы для сравнения), так что затраты на вычисление хеша не имеют значения ...

В противном случае вариант B - это то, что я хотел быперейти на ...

Чтобы получить максимальную скорость, я бы использовал MemoryMappedFile экземпляров и XOR содержимого - сравнение может быть остановлено при первом обнаружении разницы (т.е. операция XORвозвращает что-то! = 0).Что касается потребления памяти, вы можете использовать «движущееся окно» (т. Е. Через вызов CreateViewAccessor), которое позволит буквально обрабатывать файлы размером ТБ ...

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

2 голосов
/ 06 октября 2011

Предполагая, что у вас нет будущего использования хеш-информации (для сравнения с другими текстами или для проверки возможных будущих изменений), есть два случая: А) документы одинаковые Б) документы разные

Если A, то между этими двумя сценариями почти нет различий. Оба включают чтение целых файлов по одному фрагменту за раз и выполнение расчета / сравнения для каждого байта. Затраты вычислительных ресурсов хэша минимальны по сравнению с работой по чтению файлов.

Если B, то, возможно, вы найдете разницу на первой странице файлов, и в этот момент вы сможете выйти из процесса.

Таким образом, в зависимости от относительной вероятности A v B, кажется, что сравнение будет в среднем быстрее. Также обратите внимание, что вы могли бы сообщить, где происходит изменение, чего нельзя было сделать в сценарии has.

...