以下代码:
use std::fs::File;
use std::io::Write;
fn main() {
let encoded: Vec<u8> = vec![0; 2500000000];
let mut buffer = File::create("file.bin").unwrap();
let written_bytes = buffer.write(&encoded).unwrap();
assert_eq!(written_bytes, encoded.len());
}
以下错误:
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `2147479552`,
right: `2500000000`', src/main.rs:8:5
因此,似乎限制为2^31 - 4096
个字节。
我该如何解决?我想写一个更大的文件。 :)
答案 0 :(得分:6)
锈迹>>>a='a-b';b='a-b'
>>>a is b
False
依赖底层操作系统写入字节。
对于Linux系统,将使用write syscall。
根据POSIX.1,如果
write
大于count
,则结果是实现定义的;有关Linux的上限,请参见NOTES。
注意:
在Linux上,
SSIZE_MAX
(和类似的系统调用)将最多传输write()
(2,147,479,552)个字节,并返回实际传输的字节数。 (在32位和64位系统上都是如此。)
所以魔术数字从那里来。
为避免问题,请使用write_all
而不是0x7ffff000
,这将确保已写入所有字节。
请注意:如果您在Windows下运行该程序,它将运行正常。