如何有效地比较巨大的稀疏文件?

如何有效地比较巨大的稀疏文件?

有两个稀疏文件。 经 证明它们是相同的diff。 但比较花了 20 分钟(太长了)。 我想把tar它们分成小文件以加快比较速度。 但它们的tar输出不同。

它们是 512GB 的巨大的稀疏文件,只有大约 40K 有意义的数据。

% 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

diff比对耗时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

tar很快就完成了。几乎不需要任何时间。但tar输出大小不同。难怪它们不会被比较为完全相同。

% 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递归比较的可能性。

答案1

我认为我制作的这个工具可能对你有用: https://github.com/ArthurMLago/sparsediff

我还必须比较巨大的稀疏文件,表观大小为 60G,实际磁盘使用量为几百 k。我在网上找不到好的解决方案,所以我最终制作了自己的应用程序lseek,使用SEEK_HOLESEEK_DATA来高效地查找第一个文件的相关部分,并与第二个文件进行比较。输出灵感来自hexdump -C,适用于二进制文件。

相关内容