У меня супер быстрый привод M.2. Как быстро это? Это не имеет значения, потому что я все равно не могу использовать эту скорость. Вот почему я задаю этот вопрос.
У меня есть приложение, которое требует очень много памяти. Настолько, что он не поместится в оперативной памяти. К счастью, это не нужно все сразу. Вместо этого он используется для сохранения промежуточных результатов вычислений.
К сожалению, приложение не может записывать и считывать эти данные достаточно быстро. Я попытался использовать несколько потоков чтения и записи, но это только ухудшило ситуацию (позже я прочитал, что это из-за this ).
Поэтому мой вопрос: возможно ли иметь действительно асинхронный файл ввода-вывода в C ++, чтобы полностью использовать эти объявленные гигабайты в секунду? Если это так, то как (кроссплатформенным способом)?
Вы также можете порекомендовать библиотеку, которая хороша для таких задач, если вы ее знаете, потому что я считаю, что нет смысла заново изобретать колесо.
Edit:
Вот код, который показывает, как я делаю IO файла в моей программе. Это не из упомянутой программы, потому что это не будет настолько минимальным. Это, тем не менее, иллюстрирует проблему. Не против Windows.h
. Он используется только для установки сходства потоков. В реальной программе я также установил сходство, поэтому я включил его.
#include <fstream>
#include <thread>
#include <memory>
#include <string>
#include <Windows.h> // for SetThreadAffinityMask()
void stress_write(unsigned bytes, int num)
{
std::ofstream out("temp" + std::to_string(num));
for (unsigned i = 0; i < bytes; ++i)
{
out << char(i);
}
}
void lock_thread(unsigned core_idx)
{
SetThreadAffinityMask(GetCurrentThread(), 1LL << core_idx);
}
int main()
{
std::ios_base::sync_with_stdio(false);
lock_thread(0);
auto worker_count = std::thread::hardware_concurrency() - 1;
std::unique_ptr<std::thread[]> threads = std::make_unique<std::thread[]>(worker_count); // faster than std::vector
for (int i = 0; i < worker_count; ++i)
{
threads[i] = std::thread(
[](unsigned idx) {
lock_thread(idx);
stress_write(1'000'000'000, idx);
},
i + 1
);
}
stress_write(1'000'000'000, 0);
for (int i = 0; i < worker_count; ++i)
{
threads[i].join();
}
}
Как вы можете видеть, это просто старый fstream
. На моей машине это использует 100% ЦП, но только 7-9% диска (около 190 МБ / с). Мне интересно, можно ли его увеличить.