我得到了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
Run Code Online (Sandbox Code Playgroud)
包含0字节数据的1TB文件sparse-1可以通过'tar'存档到10KB tar球或通过gzip压缩到~1GB文件.gzip占用tar时间的2倍左右.
从比较来看,'tar'似乎比gzip更好.
但是,对于包含0字节数据的稀疏文件,96分钟太长.
编辑2
rsync似乎完成复制文件的时间超过tar但小于gzip: …
(正确的代码在'Update 5'中)
我尝试在此示例C代码中映射从0x100000000到0x200000000的内存范围:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/mman.h>
int main(void)
{
uint64_t* rr_addr = 0;
uint64_t i = 17179869184;
printf("\nsizeof(size_t): %llu\n", sizeof(size_t));
printf("(uint64_t)0x100000000: %llx\n", (uint64_t)0x100000000);
printf("1L << 33: %llx\n", 1L << 33);
rr_addr = mmap((void*)i, (1UL << 33), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
printf("rr_addr: %p, %llu \n", rr_addr, rr_addr);
if (rr_addr == MAP_FAILED) {
perror("mmap error");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在不同的系统(Linux,gcc)上,我得到了不同的结果:
结果1:
sizeof(size_t): 8
(uint64_t)0x100000000: 100000000
1L << 33: 200000000
rr_addr: 0xffffffffffffffff, 18446744073709551615
mmap error: Cannot allocate memory …Run Code Online (Sandbox Code Playgroud) 我尝试使用gcc编译一个旧程序(由cc编译).在makefile中有一行如下:
CFLAGS = -O2 -Olimit 2000 -w
Run Code Online (Sandbox Code Playgroud)
gcc中没有'-Olimit 2000'.我想知道它到底意味着什么.使用gcc时是否安全删除此选项.
调用 read 后实际发生了什么:
n = read(fd, buf, try_read_size);
Run Code Online (Sandbox Code Playgroud)
这里 fd 是一个 TCP 套接字描述符。buf 是缓冲区。try_read_size 是程序尝试读取的字节数。
我猜这可能最终会调用对内核的系统调用。但是有人可以提供一些细节吗?说glibc或内核源中的源代码实现?