1

我有一个字符串列表,我想根据每个文件的键输出到不同的文件(此键存在于列表中,因此如果此键在某个节点中为 1,则需要将字符串写入文件 1。 txt 并且如果键是 2 那么输出应该被重定向到 2.txt 等等......)。

我的想法是为每个列表成员分配一个唯一键,使其成为唯一记录,然后根据系统中可用处理器的数量生成多个线程。该线程将节点的输出从节点池(即我的列表)重定向到相关文件。我怀疑这是否是批处理的好设计。或者我应该只有一个线程来完成整个输出。

ps - 在我受到抨击或其他任何事情之前,让我告诉你我只是一个好奇的学习者。

4

3 回答 3

0

据我了解,您的处理步骤是:

  • 按键选择文件
  • 将项目写入文件

我认为当并行处理可以提高性能时,情况并非如此。如果您想加快此代码的速度 - 使用缓冲和异步 I/O。

  • 为每个文件维护一个标志 -正在写入
  • 当你想写一些东西到文件时——检查这个标志
    • 如果write-in-progress为 False:
      • 设置正在写入= True
      • 将您的项目添加到缓冲区
      • 开始将此缓冲区异步写入文件
    • 如果write-in-progress为 True:
      • 将您的项目添加到缓冲区
  • 当挂起的异步操作完成时
    • 检查是否有非空缓冲区,如果是则开始异步写入

还有更简单的方法:使用缓冲和同步 I/O。它会比上面描述的异步方法慢,但不会慢很多。您可以单独启动多个线程并在每个线程中遍历列表。每个线程必须只处理一些唯一的键集。例如,您可以使用两个线程,第一个线程必须只写入具有奇数键的项目,第二个线程必须只写入具有偶数键的项目。

于 2013-01-10T08:47:14.533 回答
0

使其成为单线程。然后运行,找出你的瓶颈是什么。如果您发现瓶颈是 CPU 而不是磁盘 IO,则启用并行处理。

于 2013-01-10T08:28:41.180 回答
0

你需要一个并发模型 - 无论听起来多么严重:)

首先分析一下什么可以同时做,又是什么互不相关的。想象一下你的程序的每一步都在不同的机器上执行,它们之间有某种通信,例如IP网络。

然后在这些实例(动作/机器)之间绘制一个流程。标记需要执行哪些资源操作,例如列表、文件。将资源标记为单独的实例(与操作和机器相同)。

将文件系统放到你的图片中,看看是否可以加快写入单独文件的速度,或者它会在文件系统中结束,因此会再次序列化。

连接实例。看看你是否有任何好处。它可能看起来像这样:

        list
         |
      list reader
        /  \     \
       /    \     ----------\
    file    file          file
   writer  writer        writer
     |        |              |
  file 1    file 2         file 3
     \        /              |
      \      /               |
     file system 1      file system 2

在示例中,您可以看到获得一些并行执行可能是有意义的

于 2013-01-10T09:18:28.253 回答