我在 Windows 上有两个用 C++ 编写的可执行文件。我在一个中生成了一些数据,并想调用另一个可执行文件来处理这些数据。我可以将数据写入一个文件,然后在另一个可执行文件中读取它,但这在磁盘 I/O 方面似乎相当昂贵。有什么更好的方法来做到这一点?这似乎是一个足够简单的问题,但谷歌只是没有帮助!
假设数据大约为 100MB,并且在需要发送之前完整生成(即不需要流式传输)。
混合 32 位和 64 位进程时有效的答案会获得加分。
我在 Windows 上有两个用 C++ 编写的可执行文件。我在一个中生成了一些数据,并想调用另一个可执行文件来处理这些数据。我可以将数据写入一个文件,然后在另一个可执行文件中读取它,但这在磁盘 I/O 方面似乎相当昂贵。有什么更好的方法来做到这一点?这似乎是一个足够简单的问题,但谷歌只是没有帮助!
假设数据大约为 100MB,并且在需要发送之前完整生成(即不需要流式传输)。
混合 32 位和 64 位进程时有效的答案会获得加分。
如果您的进程可以轻松地写入和读取文件,请继续。创建文件CreateFile
并将其标记为临时和可共享。Windows 使用此提示来延迟物理写入,但仍遵守所有文件语义。由于您的文件只有 100 MB 并且正在使用中,Windows 几乎可以肯定能够将其内容完全保存在 RAM 中。
您可以使用Boost.MPI。它来自具有高质量标准的 Boost,代码示例看起来非常明确:
http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point
// The following program uses two MPI processes to write "Hello, world!"
// to the screen (hello_world.cpp):
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
if (world.rank() == 0) {
world.send(1, 0, std::string("Hello"));
std::string msg;
world.recv(1, 1, msg);
std::cout << msg << "!" << std::endl;
} else {
std::string msg;
world.recv(0, 0, msg);
std::cout << msg << ", ";
std::cout.flush();
world.send(0, 1, std::string("world"));
}
return 0;
}
假设您只想走“一个方向”(也就是说,您不需要从子进程获取数据),您可以使用_popen()
. 您将数据写入管道,子进程从中读取数据stdin
。
如果您需要双向数据流,那么您将需要使用两个管道,一个作为输入,一个作为输出,并且您需要设置子进程如何连接到这些管道的方案 [您仍然可以设置stdin/stdout 作为数据路径,但您也可以使用一对命名管道]。
第三种选择是共享内存区域。我从未在 Windows 中这样做过,但原理与我在 Linux [以及多年前在 OS/2 中使用的原理几乎相同]: 1. 在父进程中创建一个具有给定名称的内存区域. 2.子进程打开同一个内存区域。3. 数据由父进程存储,由子进程读取。4. 如有必要,可以使用信号量或类似信号来表示完成/结果就绪/等。