我有一个字符串列表,我想根据每个文件的键输出到不同的文件(这个键在列表中,所以如果这个键在某个节点是1,那么这个字符串需要写到文件1.txt中,如果键是2,那么输出应该重定向到2.txt,依此类推…)。
我的想法是,为每个列表成员分配一个唯一的键,使其成为唯一的记录,然后根据系统中可用处理器的数量产生多个线程。线程将节点池(即我的列表)中节点的输出重定向到相关文件。我怀疑这是否是一个好的批处理设计。或者我应该只有一个线程来做所有的输出工作。
在我被抨击或做任何事情之前,让我告诉你我只是一个好奇的学习者。
发布于 2013-01-10 16:28:41
让它成为单线程的。然后运行,找出你的瓶颈是什么。如果您发现瓶颈是CPU而不是磁盘IO,那么启用并行处理。
发布于 2013-01-10 16:47:15
据我所知,你的处理步骤是:
按键选择文件
我认为,当并行处理可以提高性能时,情况并非如此。如果您想要加速这段代码--使用缓冲和异步I/O。
为每个文件维护一个标志- write-in-progress
>H117开始将此缓冲区写入文件asynchronously
- if _write-in-progress_ is True:
- add your item to buffer
还有一种更简单的方法:使用缓冲和同步I/O。它将比上面描述的异步方法慢,但不是很慢。您可以启动多个线程,并单独遍历每个线程中的列表。每个线程必须只处理一些唯一的键集。例如,您可以使用两个线程,第一个线程只能写入具有奇数键的项,第二个线程必须只写入具有偶数键的项。
发布于 2013-01-10 17:18:28
为此,您需要一个并发模型--不管它听起来多么严重:)
首先,分析哪些是可以同时完成的,哪些是彼此无关的。想象一下,你的程序的每一步都是在不同的机器上执行的,它们之间存在某种通信,比如IP网络。
然后在这些实例(操作/机器)之间绘制一个流。标记需要执行的资源操作,例如列表、文件。将资源标记为单独的实例(与操作和计算机相同)。
将文件系统放在您的图片中,看看是否可以加快单独文件的写入速度,或者它将在文件系统中结束,从而再次序列化。
连接实例。看看你能不能得到什么好处。它可能看起来像这样:
list
|
list reader
/ \ \
/ \ ----------\
file file file
writer writer writer
| | |
file 1 file 2 file 3
\ / |
\ / |
file system 1 file system 2在该示例中,您可以看到获得一些并行执行可能是有意义的
https://stackoverflow.com/questions/14253499
复制相似问题