|
|
1
2
我认为最好的方法是生成一个不同的线程来保存数据,而不是一个全新的进程;对于一个新流程,您必须跨越流程边界传递要保存的数据,这带来了一系列新的困难。 |
|
|
2
5
想到的第一个解决方案几乎就是你所说的——在自己的进程中使用从sim到writer的单向管道进行磁盘写入。作者确实尽可能快地写(从管道中提取新数据)。这样做的问题是,如果sim远远领先于writer,那么sim无论如何都会阻塞管道写入,并且只需一步就会受到I/O限制。 问题是,事实上,在输出结果之前,你的模拟周期是不完整的。 我想到的第二件事是使用非阻塞I/O。每当sim需要写入时,它应该通过非阻塞I/O进行写入。在下一次需要写入的时候,它可以在开始新的I/O操作之前获取上一次I/O操作的结果(可能会引起一点等待)。这使模拟尽可能与I/O并行运行,而不会让模拟在写入之前走得太远。 如果模拟处理周期不同(有时小于写入时间,有时更长),第一种解决方案会更好,因为平均而言,写入可能会跟上sim的速度。
|
|
|
3
3
如果你在程序中实现了OpenMP,那么最好使用 #pragma omp单曲 #pragma omp大师 从并行部分保存到文件。这些pragmas只允许一个线程执行某些操作。因此,您的代码可能如下:
在这里,线程团队将进行计算,但只有单个线程会将结果保存到磁盘。 它看起来像软件管道。我建议您考虑英特尔线程构建块库中的tbb::管道模式。我可以向您推荐软件管道教程,网址为 http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=25 请阅读第4.2段。他们解决了这个问题:一个线程从驱动器读取,第二个线程处理读取字符串,第三个线程保存到驱动器。 |
|
|
4
1
既然你受到CPU和IO的限制:让我猜猜:还有足够的内存可用,对吧?
|
|
|
5
0
一个线程持续执行计算密集型过程的一个步骤,然后将部分结果添加到部分结果队列中。另一个线程不断地从队列中删除部分结果并将其写入磁盘。确保同步对队列的访问。队列是一种类似列表的数据结构,您可以在其中将项目添加到末尾并从前面删除项目。 |
|
6
0
让你的应用程序有两个 一个用于CPU,一个用于硬盘。 让CPU线程将完成的数据推送到队列中,然后硬盘线程在数据进来时从队列中提取数据。 这样,CPU只需处理数据并让其他人处理,硬盘驱动器只需耐心等待队列中的任何数据。 在实现方面,您可以将队列作为共享内存类型的对象,但我认为管道正是您要寻找的。CPU只需在需要时写入管道。在硬盘方面,你只需读取管道,每当你得到有效数据时,就从那里继续。 |