gpt4 book ai didi

c - 为非常大的文件做准备

转载 作者:太空狗 更新时间:2023-10-29 15:26:02 26 4
gpt4 key购买 nike

我正在使用 pread 读取一个大文件,如下所示:

ssize_t s = pread(fd, buff, count, offset);
if (s != (ssize_t) count)
fprintf(stderr, "s = %ld != count = %ld\n", s, count);
assert(s == (ssize_t ) count);

以上代码对于小文件(最大 1.5GB)运行良好。但是,对于大文件大小,返回的字节数与预期计数不同。

特别是,对于 2.4GB 的文件大小,我的 count 设置为 2520133890 并且断言失败,fprintf 说:

s = 2147479552 != count = 2520133890

令人费解的是我在 64 位系统上工作,因此 sizeof(ssize_t) = 8

失败的原因是什么?如何解决才能一次读取整个文件?

最佳答案

看起来你使用的是 linux,pread 返回的魔数(Magic Number)是 2147479552 = 0x7ffff000,所以答案在 man 2 read 中:

On Linux, read() (and similar system calls) will transfer at most 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes actu‐ ally transferred. (This is true on both 32-bit and 64-bit systems.)

所以你至少需要两次调用pread来获取你的数据,此限制与 _FILE_OFFSET_BITS=64O_LARGEFILEsizeof(off_t) 等无关,此限制由 linux 内核中的 rw_verify_area 创建:

/*
* rw_verify_area doesn't like huge counts. We limit
* them to something that fits in "int" so that others
* won't have to do range checks all the time.
*/
int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)
...
return count > MAX_RW_COUNT ? MAX_RW_COUNT : count;

#define MAX_RW_COUNT (INT_MAX & PAGE_CACHE_MASK)

关于c - 为非常大的文件做准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36565209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com