Как записать файлы размером более 2 ГБ? - PullRequest
0 голосов
/ 17 декабря 2018

Следующий код:

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 байтов.

Как я могуобойти это?Я хотел бы написать файл большего размера.:)

1 Ответ

0 голосов
/ 17 декабря 2018

Rusts write полагается на базовую ОС для записи байтов.

Для систем Linux будет использоваться системный вызов write .

СогласноPOSIX.1, если count больше SSIZE_MAX, результат определяется реализацией;см. примечания для определения верхнего предела в Linux.

Примечания:

В Linux write() (и аналогичные системные вызовы) будет передавать не более 0x7ffff000 (2 147 479 552)) байтов, возвращая количество фактически переданных байтов.(Это верно как для 32-битных, так и для 64-битных систем.)

Итак, откуда приходит магическое число.

Чтобы обойти вашу проблему, используйте write_all вместо write, что обеспечит запись всех байтов.

Примечание: если вы запустите программу под Windows, она будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...