Я занимаюсь большим вводом/выводом на куче SSD и обнаружил, что могу получить необходимую производительность, используя Async Read/Write с Libaio (io_uring мне не доступен). Проблема в том, что мне иногда нужно делать записи, которые не являются кратными размера страницы, а также добавляют к файлам, которые уже не растут размером блока. < /P>
Есть ли хорошая стратегия здесь? Вот некоторые вещи, о которых я думал, которые не звучат великолепно. Старые и новые данные. Затем в конце я смог подать последний блок, а затем усечь файл до желаемого размера, когда закончу. Я немного неохотно делаю это, так как ошибка в моем коде испортит конец существующего файла. тот же файл? Я мог бы написать первый неполный блок и последний неполный блок с не O_Direct FD и сделать большую среднюю с асинхронным IO. Тогда fsync? Я не уверен, что это хорошая идея. < /P>
Есть лучшие варианты? -Поджание размера данных с использованием нативного AIO:
https://wandbox.org/permlink/rz0zyuycy0xfpao0
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
template class ScopeExit {
public:
explicit ScopeExit(FuncT&& fn) : f(std::forward(fn)) {}
~ScopeExit() { f(); }
ScopeExit(const ScopeExit&) = delete;
ScopeExit& operator=(const ScopeExit&) = delete;
ScopeExit(ScopeExit&&) = delete;
ScopeExit& operator=(ScopeExit&&) = delete;
private:
FuncT f;
};
template ScopeExit(F&&) -> ScopeExit;
template long checked_syscall(long syscall_number, Args... args) {
long ret = syscall(syscall_number, args...);
if (ret < 0) {
auto error = errno;
std::cerr
Подробнее здесь: https://stackoverflow.com/questions/794 ... ith-libaio