当前位置: 首页 > 面试题库 >

复制1TB稀疏文件

裴嘉许
2023-03-14
问题内容

我得到了一个1TB的稀疏文件,在Linux上实际上存储了32MB数据。

是否可以“有效地”制作一个软件包来存储稀疏文件?该软件包应解压缩为另一台计算机上的1TB稀疏文件。理想情况下,“软件包”应为32MB左右。

注意:可能的解决方案是使用“
tar”:https
:
//wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27

但是,对于1TB的稀疏文件,尽管tar球可能很小,但是将稀疏文件存档会花费很长时间。

编辑1

测试了tar和gzip,结果如下(请注意,此稀疏文件包含0字节的数据)。

$ du -hs sparse-1
0   sparse-1

$ ls -lha sparse-1
-rw-rw-r-- 1 user1 user1 1.0T 2012-11-03 11:17 sparse-1

$ time tar cSf sparse-1.tar sparse-1

real    96m19.847s
user    22m3.314s
sys     52m32.272s

$ time gzip sparse-1

real    200m18.714s
user    164m33.835s
sys     10m39.971s

$ ls -lha sparse-1*
-rw-rw-r-- 1 user1 user1 1018M 2012-11-03 11:17 sparse-1.gz
-rw-rw-r-- 1 user1 user1   10K 2012-11-06 23:13 sparse-1.tar

包含0字节数据的1TB文件sparse-1可以由’tar’存档到10KB的tar球中,也可以由gzip压缩为〜1GB文件。gzip的时间大约是tar使用时间的2倍。

通过比较,“ tar”似乎比gzip更好。

但是,对于包含0字节数据的稀疏文件,96分钟太长了。

编辑2

rsync似乎完成复制文件的时间多于tar但少于gzip

$ time rsync --sparse sparse-1 sparse-1-copy

real    124m46.321s
user    107m15.084s
sys     83m8.323s

$ du -hs sparse-1-copy 
4.0K    sparse-1-copy

因此,对于这个极为稀疏的文件,tar+ cpscp应该比直接速度更快rsync

编辑3

感谢@mvp指出了较新内核中的SEEK_HOLE功能。(我以前在2.6.32 Linux内核上工作)。

注意:必须使用bsdtar版本> = 3.0.4(请在此处查看:http://ask.fclose.com/4/how-to-effective-archive-a-very-large-
sparse-file?show = 299#c299 )。

在新的内核和Fedora发行版(17),tar以及cp把手稀疏文件 非常 有效。

[zma@office tmp]$ ls -lh pmem-1

-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
[zma@office tmp]$ time tar cSf pmem-1.tar pmem-1

real    0m0.003s
user    0m0.003s
sys 0m0.000s
[zma@office tmp]$ time cp pmem-1 pmem-1-copy

real    0m0.020s
user    0m0.000s
sys 0m0.003s
[zma@office tmp]$ ls -lh pmem*
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:15 pmem-1-copy
-rw-rw-r-- 1 zma zma  10K Nov  7 20:15 pmem-1.tar
[zma@office tmp]$ mkdir t
[zma@office tmp]$ cd t
[zma@office t]$ time tar xSf ../pmem-1.tar

real    0m0.003s
user    0m0.000s
sys 0m0.002s
[zma@office t]$ ls -lha
total 8.0K
drwxrwxr-x   2 zma  zma  4.0K Nov  7 20:16 .
drwxrwxrwt. 35 root root 4.0K Nov  7 20:16 ..
-rw-rw-r--   1 zma  zma  1.0T Nov  7 20:14 pmem-1

我正在使用3.6.5内核:

[zma@office t]$ uname -a
Linux office.zhiqiangma.com 3.6.5-1.fc17.x86_64 #1 SMP Wed Oct 31 19:37:18 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

问题答案:

简短答案: 使用bsdtar或GNU tar(1.29或更高版本)来创建档案,并使用GNU
tar(1.26或更高版本)来将它们提取到另一个盒子上。

长答案: 这项工作有一些要求。

首先,Linux必须至少为内核3.1(Ubuntu 12.04或更高版本可以使用),因此它支持SEEK_HOLE功能。

然后,您需要可以支持此syscall的tar实用程序。GNU tar自1.29版(于2016/05/16发布,自Ubuntu
18.04起默认存在)或bsdtar自3.0.4版(自Ubuntu 12.04起可用)提供支持sudo apt-get install bsdtar

尽管bsdtar(使用libarchive)很棒,但是不幸的是,它在解压缩时不是很聪明-
它愚蠢地要求目标驱动器上的空闲空间至少等于未解压缩文件的大小,而不考虑漏洞。GNU tar将有效地解压缩此类稀疏档案,并且不会检查这种情况。

这是来自Ubuntu 12.10(Linux kernel 3.5)的日志:

$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s

$ time bsdtar cvfz sparse.tar.gz 1tb 
a 1tb

real    0m0.362s
user    0m0.336s
sys 0m0.020s

# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb

real    0m0.005s
user    0m0.006s
sys 0m0.000s

$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser           134 Nov  7 01:43 sparse-gnutar.tar.gz
$

就像我在上面说的那样,不幸的是,bsdtar除非拥有1TB的可用空间,否则使用松散是行不通的。但是,任何版本的GNU都tar可以解压缩,例如sparse.tar

$ rm 1tb 
$ time tar -xvSf sparse.tar.gz 
1tb

real    0m0.031s
user    0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz


 类似资料:
  • 问题内容: 我一直在使用openSUSE 11.2 x86_64上的大型稀疏文件。当我尝试mmap()1TB的稀疏文件时,它因ENOMEM而失败。我本以为64位地址空间足以映射到TB级,但似乎还不够。进一步试验,一个1GB的文件可以正常工作,但是一个2GB的文件(以及更大的文件)会失败。我猜想可能有一个需要调整的地方,但是广泛的搜索没有任何效果。 这是一些显示问题的示例代码-有什么线索吗? 问题答

  • 问题内容: 我想将文件从一个地方复制到另一个地方,问题是我处理了很多稀疏文件。 有什么(简单的)复制稀疏文件而不会在目标位置变得庞大的方法? 我的基本代码: 问题答案: 一些背景理论 请注意,通过管道传输原始字节–一旦您认为将原始数据通过管道从到提供和的,就可以理解。这样,绝对可以处理提供字节的任何源以及使用它们的任何接收器。 另一方面,文件中漏洞的位置是“侧通道”信息,这些“侧通道”信息是“经典

  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.

  • 我正在使用Jax-RS和Jooq。我想知道如何使用稀疏数据实现REST补丁。 比如说我有一些PoJo。我得到了一个JSON补丁(http://www.restapitutorial.com/lessons/httpmethods.html)请求的对象不完整,只包含应该更改的字段。 我该如何编写这样的处理程序? 我试着接受真实的Pojo对象。我的第一个想法是“如果一个字段为空,我就不更新它”。这是我

  • 这个例子展示了如何使用 scikit-learn 中的单词包方法,根据主题对文档进行分类。本例使用scipy.sparse中的矩阵来存储特征,并演示各种能够有效处理稀疏矩阵的分类器。 本例中使用的数据集是20条新闻组数据集。通过scikit-learn可以自动下载该数据集,并进行缓存。 下述条形图展示了各个不同分类器,其信息包括精度、训练时间(已归一化)和测试时间(已归一化)。 import lo

  • 问题内容: 也就是说,如果我将当前时间用作数组的索引: 解释器将实例化从0到现在的所有元素吗?不同的浏览器会做不同的事情吗? 我记得AIX内核中曾经存在一个错误,该错误会在请求时创建伪tty,但是如果您说“ echo> / dev / pty10000000000”,它将创建/ dev / pty0,/ dev / pty1, ....然后跌倒死亡。在贸易展览会上这很有趣,但是我不希望这种情况发生