Используйте вашу ОС
Вы пробовали сравнивать контрольные суммы, такие как md5sum
, рассчитанные вашей операционной системой?
В большинстве современных ОС есть утилиты для вычисления контрольных сумм файлов, и обычно они выполняются ядром очень быстро.
Файловые системы
Некоторые файловые системы (brtfs, ZFS,...) иметь контрольные суммы данных, хранящихся в каждом блоке.При наличии такой файловой системы вычисление контрольной суммы всего очень большого файла должно быть не сложным.
Я хотел бы знать о таких инструментах ...
Программно
- Использовать столько потоков, сколько процессоров доступно на платформе
ExecutorService e = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
В каждом потоке откройте оба файла как READ ONLY и отобразите непересекающиеся сегменты файлов в MappedByteBuffer
s:
FileChannel fc1 = new RandomAccessFile(new File("/path/to/file1"), "ro").getChannel();
MappedByteBuffer mem1 = fc1.map(FileChannel.MapMode.READ_ONLY, offset, BUFFER_SIZE);
FileChannel fc2 = new RandomAccessFile(new File("/path/to/file2"), "ro").getChannel();
MappedByteBuffer mem2 = fc2.map(FileChannel.MapMode.READ_ONLY, offset, BUFFER_SIZE);
Вызов Arrays.equals(mem1.array(), mem2.array())
Теперь вместо перехода к случайному байту в файлах сделайте переходы к последовательным смещениям файлов, сравнивая BUFFER_SIZE байтовых кусков за раз для каждого потока в number_of_available_cores одновременно.
Настройка BUFFER_SIZE на размер блока на диске, а размер страницы в Виртуальная память должен дать желаемое ускорение.Наибольшее замедление всего сравнения будет связано с Виртуальной памятью НЕИСПРАВНОСТЬЮ СТРАНИЦЫ , SWAPPING , и хуже всего THRASHING .
См. здесь для получения дополнительной информации о мониторинге производительности кода VirtMem в Linux .В Windows VMMap может помочь.См. Также эту статью TechNet о различных счетчиках, доступных в Windows и . Эта статья, объясняющая работу VirtMem в Windows
Выше также означает, что последовательная обработка вместо случайных переходов дает лучшие результаты.результатов, поскольку это приводит к уменьшению PAGE_FAULTS и минимизации страницы VirtMem THRASHING
Удерживая битовый вектор в памяти уже проверенных фрагментов, вы можете вычислить точную достоверностьравенство.Затем, когда принимается решение сравнить весь файл, все, что вам нужно сделать, это посетить еще не посещенных кусков файлов.