我正在编写一个应用程序需要使用大型音频多样本,通常大小约为50 MB.一个文件包含大约80个单独的短录音,可以随时由我的应用程序播放.因此,所有音频数据都会加载到内存中以便快速访问.
但是,当加载其中一个文件时,可能需要很长时间才能放入内存,因为我需要使用ifstream读取大量数据,这意味着我的程序GUI暂时被冻结.我已经尝试了内存映射我的文件但是每次我需要跳转到文件的不同区域时,这会导致巨大的CPU峰值和混乱的音频,这是不可接受的.
所以这让我认为执行异步文件读取将解决我的问题,即在不同的进程中读取数据并在完成时调用函数.这需要兼容Mac OS X和Windows以及C++.
编辑:不想使用Boost库,因为我想保留一个小的代码库.
我想从cin做异步读取因此我有一段代码
client.h
...
boost::asio::posix::stream_descriptor input;
boost::asio::streambuf input_buffer
Run Code Online (Sandbox Code Playgroud)
client.cpp
Client::Client(int argc, char **argv, boost::asio::io_service &io_service)
: tcp_socket(io_service)
, udp_socket(io_service)
, input(io_service, ::dup(STDIN_FILENO))
{
...
read_std_input();
}
void Client::read_std_input() {
async_read_until(input, input_buffer, '\n',
boost::bind(&Client::handle_std_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
Run Code Online (Sandbox Code Playgroud)
问题是:当我以正常方式[./client]运行我的客户端然后通过命令输入一些东西时,它就像魅力一样.但是,当我通过[./client <test]运行它时会抛出:
在抛出'boost :: exception_detail :: clone_impl的实例后终止调用
'what():assign:不允许操作中止
你知道问题可能是什么吗?谢谢!
我有一个超快的 M.2 驱动器。它有多快?没关系,因为无论如何我都无法利用这个速度。这就是我问这个问题的原因。
我有一个需要大量内存的应用程序。太多以至于它不适合RAM。幸运的是,它不是一下子需要的。相反,它用于保存计算的中间结果。
不幸的是,应用程序无法足够快地写入和读取此数据。我尝试使用多个读取器和写入器线程,但这只会使情况变得更糟(后来我读到这是因为这个)。
所以我的问题是:是否有可能在 C++ 中使用真正的异步文件 IO 来充分利用那些宣传的每秒千兆字节?如果它比如何(以跨平台方式)?
如果您知道,您还可以推荐一个适合此类任务的库,因为我相信重新发明轮子没有意义。
这是显示我如何在我的程序中执行文件 IO 的代码。它不是来自提到的程序,因为它不会那么小。不过这说明了问题。别介意Windows.h。它仅用于设置线程关联。在实际程序中我也设置了affinity ,所以这就是我包含它的原因。
#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 …Run Code Online (Sandbox Code Playgroud)