【发布时间】:2016-06-03 04:52:47
【问题描述】:
我正在玩文件读/写,但很难决定为“读取”系统调用设置多大的读取缓冲区。
特别是,我正在查看“http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html”
除了 SSIZE_MAX 之外,似乎对我一次可以读取的字节数没有任何限制。
更糟糕的是,如果我创建一个包含 SSIZE_MAX 个字符的数组,程序会产生:
sh: ./codec: Bad file number
是否有任何合理的方法来决定每次读取系统调用读取多少字节?我担心这可能会因系统而异(我不能只进行尽可能多的读取,直到读取无法确定我可以读取的确切字节数,即使我这样做了,它也不一定会更快比读取更少的字节)。
我的一个想法是检查我的 CPU 缓存大小并尝试使我的缓冲区不大于该大小,但由于我不知道 CPU 缓存是如何工作的,所以我不确定这是否一定正确。
提前谢谢。
【问题讨论】:
-
“错误的文件号”听起来确实与指定的缓冲区大小有关,除非发生了其他事情。请注意,SSIZE_MAX 一般为far too large for a buffer。
-
@user2864740 是的。
SSIZE_MAX在 32 位系统上为 2 GB,在 64 位系统上为 8 EB。 -
错误代码
EBADFD(错误文件号)可能来自不同的来源,可能您忘记检查打开要读取的文件是否真的成功。 -
@Dmitry:如果您看到this 性能图,您认为合理的缓冲区大小是多少? (绿色是读,红色是写。)
-
@Dmitry:了解为什么如此复杂的另一种方法是认识到文件的不同部分甚至可能不在同一个存储上。例如,在 RAID(和 LVM?)系统上,某些部分可能分散在磁盘上,并且由于并行化或单个磁盘活动,读取不同部分可能需要不同的时间。或者,在虚拟磁盘(例如增量 VHD)上,文件的不同部分可以位于完全不相关的存储介质上。所以这是另一个复杂程度(人们通常会忽略),它说明了为什么 1 个数字是不够的。
标签: c io posix bufferstrategy