我有一个超级快的M.2驱动器,它有多快并不重要,因为我无论如何都不能利用这个速度。这就是为什么我问这个问题的原因。
我有一个需要大量内存的应用程序,很多时候它无法全部放入RAM中,但幸运的是,它并不需要一次性全部使用。相反,它用于保存计算过程中的中间结果。
不幸的是,该应用程序无法快速读写这些数据。我尝试使用多个读取器和写入器线程,但结果只会更糟(后来我看到了这个)。
因此,我的问题是:在C++中是否可能拥有真正的异步文件IO以充分利用那些宣传的每秒几十亿字节?如果可以的话,如何实现(以跨平台的方式)?
如果您知道一个好的支持这种任务的库,也可以给我推荐一个,因为我相信没有必要重新发明轮子。
编辑:
这里有一个展示我如何在程序中进行文件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%的CPU,但只使用了7-9%的磁盘(约190MB/s)。我想知道它是否可以提高。