小编eri*_*zma的帖子

复制1TB稀疏文件

我得到了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: …

linux file sparse-file

16
推荐指数
2
解决办法
2万
查看次数

当长度大于4GB时,mmap失败

(正确的代码在'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)

c linux gcc glibc fedora

13
推荐指数
1
解决办法
8798
查看次数

'-Olimit 2000'对cc意味着什么?

我尝试使用gcc编译一个旧程序(由cc编译).在makefile中有一行如下:

CFLAGS = -O2 -Olimit 2000 -w
Run Code Online (Sandbox Code Playgroud)

gcc中没有'-Olimit 2000'.我想知道它到底意味着什么.使用gcc时是否安全删除此选项.

gcc cc

2
推荐指数
1
解决办法
554
查看次数

为 Linux 套接字调用 read 后会发生什么

调用 read 后实际发生了什么:

n = read(fd, buf, try_read_size);
Run Code Online (Sandbox Code Playgroud)

这里 fd 是一个 TCP 套接字描述符。buf 是缓冲区。try_read_size 是程序尝试读取的字节数。

我猜这可能最终会调用对内核的系统调用。但是有人可以提供一些细节吗?说glibc或内核源中的源代码实现?

sockets linux networking

2
推荐指数
1
解决办法
671
查看次数

标签 统计

linux ×3

gcc ×2

c ×1

cc ×1

fedora ×1

file ×1

glibc ×1

networking ×1

sockets ×1

sparse-file ×1