Задать вопрос
Eugene-Usachev
@Eugene-Usachev

Как быстро записать на диск в одном потоке?

Есть программа, каждые n времени происходит дамп огромного буфера на диск. Сложность в том, что я хочу, чтобы программа не особо замечала этот дамп.

Как сейчас работает программа: она собирает из огромного буфера данные в малый буфер до его заполнения и дампает на диск, и так пока не пройдёт по всему огромному буферу (происходит копирование). Я запускаю её в один поток и полностью нагружаю одно ядро. Однако я заметил, что из 10 секунд на дамп + копирование в малый буфер, я трачу 7 секунд на сам дамп. Я могу распараллелить процесс на несколько файлов, но тогда мне нужно и несколько потоков (по-одному на файл).

Как я полагаю, большую часть времени я жду, пока диск прокрутиться до нужного файла, в этот момент программа с полным малым буфером ждёт и бездействует. Хотелось бы создать условно k файлов и писать в каждый по мере его доступа, чтобы один поток мог писать без остановки (порядок данных не важен). Существует ли готовое решение для этого и существует ли решение для записи, которое быстрее, чем стандартный

use std::fs::File;
use std::io::Write;
use std::{thread};
let mut output = File::create(path.clone()).expect(&*format!("failed to create file with path {}", path.clone()));
// some code
output.write(&*buf).expect("failed to write");
  • Вопрос задан
  • 371 просмотр
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Я могу распараллелить процесс на несколько файлов

Разпараллеливание записи на несколько файлов не имеет смысла для обычных десктопных дисков.
Это только в серверных системах хранения где RAID - такая оптимизация имела-бы смысл.

Чтоб оптимизировать запись (развязать ожидания рабочих потоков от потока записи) можно
создать кольцевой буфер записи и поручить его сброс отдельному потоку. Размер этого
кольца можно выбрать экспериментально. Я не очень понимаю зачем тебе нужен набор
буферов (больших и малых) это возможно часть алгоритма. Но я-бы избавился от ненужных
копирований внутри памяти если есть возможность.

Можно еще посмотреть какие возможности в Rust есть в части асинхронного I/O но я здесь не специалист
в расте насколько глубоко чтоб знать где это и как называется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы