c++ - 在 C++ 中在内存中创建大流

标签 c++ iostream

我正在使用创建大量 (>4GB) 二进制数据的外部库。我想缓冲这些数据并在它仍在创建时将其提供给第二个库。

我的程序是一个 64 位进程,在 Linux 上运行。我无法对将要运行它的系统的 RAM 做出任何保证。

对于第一个库,我实现了库调用的虚函数,以向我提供二进制数据:

virtual void put_data(uint8_t* data, size_t s_data);

我可以自由地使用这些数据在已实现的函数中做任何我想做的事情。

第二个库同样需要 100 字节的数据 block 。该函数如下所示:

void write(const uint8_t* buffer);

所以理论上我可以做的是在一个线程中启动第一个库,在第二个线程中启动第二个库,当数据来自第一个库时,循环将此数据提供给第二个库(如果可用) .现在显然我不能只转发缓冲区,因为它们可能有不同的大小。在 C++ 中是否有一种方便的方法来执行此操作,还是我必须为此编写一个新类?

最佳答案

首先,你可以在 tmpfs 中写入文件挂载的文件系统。然后,文件位于 virtual memory ,并且只要它们适合 RAM,就不会发生磁盘 IO。顺便说一句,Linux 有一个很好的 page cache因此,当一个进程写入一些可以快速读取和使用的文件时,很少会发生磁盘 IO(即使在普通文件系统上也是如此)。另请阅读 http://linuxatemyram.com/

既然你提到运行两个线程,你可以设置一个pipe(7)在线程之间进行通信(一个线程写入管道,另一个线程从管道读取)。阅读Advanced Linux Programming & 一些 pthreads tutorial .也可以考虑学习C++11 programming ,完全重新设计您的程序并使用 C++11 中引入的许多功能(如闭包 - 还可以了解更多关于 continuationsCPS 、容器、智能指针等)。

最后,您可以将所有数据保存在虚拟内存中,也许使用 std::stringstream , open_memstream(3) ,或者只是 std::string

另见 fifo(7) , shm_overview(7) , sem_overview(7) .了解有关 C++11 threads 的更多信息更一般地关于 Inter Process Communication techniques & event loops (例如上面的 poll(2) ...)。

关于c++ - 在 C++ 中在内存中创建大流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32498785/

相关文章:

c++ - 如何清除 C++ 中 istringstream 对象的缓冲区?

c++ - std::vector 如何处理可变长度的 std::string?

c++ - 使用 << 运算符处理可变数据

c++ - 为什么这个volatile变量的地址一直是1?

c++ - 在 C++ 中是否允许在 iostream 之后编写任何内容

c++ - I/O 流标志如何工作?

c++ - 将调用两个重载模板中的哪一个?

java - 为什么我不能通过套接字连接android和PC?

c++ - 定义整数之间的特殊除法

C++ 在我使用 getline 从文件中读取后,我无法再写入 txt 文件