Как эффективно сравнивать огромные разреженные файлы?
Есть два редких файла. Их идентичность доказана. Но на сравнение ушло 20 минут (слишком долгое время). Я подумываю объединить их в небольшие файлы, чтобы ускорить сравнение. Но они на разные выходы.
Это огромные разреженные файлы размером 512 ГБ, содержащие всего около 40 000 значимых данных.
% ls -l sparse_file_one/
total 40
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:12 sdd.img
% ls -l sparse_file_two/
total 48
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:13 sdd.img
% du sparse_file_one/sdd.img
40 sparse_file_one/sdd.img
% du sparse_file_two/sdd.img
48 sparse_file_two/sdd.img
сравнение занимает 20 минут. Они оказались идентичными.
% diff -qs --speed-large-files sparse_file_one/sdd.img sparse_file_two/sdd.img | pv
68.0 B 0:20:57 [55.4miB/s] [ <=> ]
Files sparse_file_one/sdd.img and sparse_file_two/sdd.img are identical
Как ихdu
использование диска различается, я изучаюfilefrag
и подтвердите, что их внутренние представления различаются.
% filefrag -v sparse_file_one/sdd.img
Filesystem type is: ef53
File size of sparse_file_one/sdd.img is 512711720960 (125173760 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 6866944.. 6866944: 1:
1: 8192.. 8194: 6852608.. 6852610: 3: 6875136:
2: 12288.. 12288: 6854656.. 6854656: 1: 6856704:
3: 16384.. 16384: 6868992.. 6868992: 1: 6858752:
4: 16448.. 16449: 6869056.. 6869057: 2:
5: 16512.. 16512: 6869120.. 6869120: 1: last
sparse_file_one/sdd.img: 4 extents found
% filefrag -v sparse_file_two/sdd.img
Filesystem type is: ef53
File size of sparse_file_two/sdd.img is 512711720960 (125173760 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 6871040.. 6871040: 1:
1: 8192.. 8195: 6856704.. 6856707: 4: 6879232:
2: 12288.. 12288: 6858752.. 6858752: 1: 6860800:
3: 16384.. 16384: 6860800.. 6860800: 1: 6862848:
4: 16448.. 16449: 6860864.. 6860865: 2:
5: 16512.. 16512: 6860928.. 6860928: 1:
6: 125173759..125173759: 132128862.. 132128862: 1: 132018175: last,eof
sparse_file_two/sdd.img: 5 extents found
завершается быстро. Это не занимает буквально никакого времени. Но размеры вывода различаются. Неудивительно, что их не будут сравнивать идентичными.
% cd ../sparse_file_one/
sparse_file_one % tar -cvSf sdd.img.tar --mtime=@0 sdd.img | pv
tar: Option --mtime: Treating date '@0' as 1970-01-01 08:00:00
sdd.img
8.00 B 0:00:00 [26.2KiB/s] [ <=> ]
sparse_file_one % ls -l
total 80
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:12 sdd.img
-rw-r--r-- 1 midnite midnite 40960 Mar 5 00:22 sdd.img.tar
% cd ../sparse_file_two
sparse_file_two % tar -cvSf sdd.img.tar --mtime=@0 sdd.img | pv
tar: Option --mtime: Treating date '@0' as 1970-01-01 08:00:00
sdd.img
8.00 B 0:00:00 [ 520KiB/s] [ <=> ]
sparse_file_two % ls -l
total 100
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:13 sdd.img
-rw-r--r-- 1 midnite midnite 51200 Mar 5 00:23 sdd.img.tar
(Со ссылкой на этот пост, обнуляющийmtime
делает идентичнымtar
архивы. Я мог бы создать идентичные архивы из других идентичных разреженных или неразреженных файлов. Но такое поведение, очевидно, не гарантировано.)
(Согласно этому сообщению, если бы я мог извлечь содержимое разреженного файла менее чем за 10 минут , было бы быстрее проверить, что они идентичны. Но я не знаю Python. Было бы неплохо, если бы какая-нибудь собственная программа Linux могла это сделать. это.)
PS - я бы предпочел использоватьdiff
кcmp
для возможности рекурсивного сравнения каталогов.