Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 批处理_C_Multithreading_Batch Processing - Fatal编程技术网

C 批处理

C 批处理,c,multithreading,batch-processing,C,Multithreading,Batch Processing,我有一个字符串列表,我想根据每个文件的键将其输出到不同的文件。该键位于列表中,因此,如果该键在某个节点中为1,则该字符串需要写入文件1.txt,如果该键为2,则输出应重定向到2.txt,依此类推 我的想法是,为每个列表成员分配一个唯一的键,使其成为唯一的记录,然后根据系统中可用的处理器数量生成多个线程。线程将节点的输出从我的列表中的节点池重定向到相关文件。我怀疑这是否是一个好的批量处理设计。或者我应该只有一个线程来完成整个输出 ps-在我被攻击之前,让我告诉你我只是一个好奇的学习者。让它成为单线

我有一个字符串列表,我想根据每个文件的键将其输出到不同的文件。该键位于列表中,因此,如果该键在某个节点中为1,则该字符串需要写入文件1.txt,如果该键为2,则输出应重定向到2.txt,依此类推

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


ps-在我被攻击之前,让我告诉你我只是一个好奇的学习者。

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

据我所知,您的处理步骤是:

按键选择文件 将项目写入文件 我认为当并行处理可以提高性能时,情况并非如此。如果您想加速此代码,请使用缓冲和异步I/O

为每个文件维护一个标志-正在写入 当您想将某些内容写入文件时,请选中此标志 如果“正在写入”为False: 将“正在写入”设置为True 将项目添加到缓冲区 开始将此缓冲区异步写入文件 如果正在写入为True: 将项目添加到缓冲区 当挂起的异步操作完成时 检查是否存在非空缓冲区,如果是,则启动异步写入
有一种更简单的方法:使用缓冲和同步I/O。它将比上面描述的异步方法慢,但不会太多。您可以启动多个线程并独立遍历每个线程中的列表。每个线程只能处理一些唯一的密钥集。例如,您可以使用两个线程,第一个线程必须只写具有奇数键的项,第二个线程必须只写具有偶数键的项。

您需要一个并发模型来实现这一点-无论听起来多么严重:

首先分析什么是可以同时完成的,哪些是相互无关的。假设您的程序的每个步骤都在不同的机器上执行,并在不同的机器之间进行某种通信,例如IP网络

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

将文件系统放在图片中,查看是否可以加快编写单独的文件,或者它将在文件系统中结束,从而再次序列化

连接实例。看看有没有什么好处。可能是这样的:

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

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

字符串的输入列表也是文本文件吗?如果是这样,那么使用awk/perl/phython/php等脚本似乎会更容易。正如@bobah所说,您很可能是IO绑定的,在这种情况下,多线程对您没有帮助。不,它只是一个链表,其中一个成员是字符串。我希望这个程序可以跨多个处理器移植,也就是说,它可以在单处理器和多处理器上工作。我的程序中确实有工作数据结构,可以告诉我系统中有多少处理器。那么,我应该为单处理器和多处理器制作两个不同的版本吗?这取决于系统中有多少处理器,当然,这就是我要做的。这可能会让事情变得更清楚:我有一个链表,它的节点有以下成员:iString to_writeo of fixed length。iifile\u name我在其中附加“to\u write”的文件的名称/id。还有一些事情。我可以通过索引列表来并行地将数据写入文件吗?如果我有多个处理器,为什么不充分利用它呢?这只是学习一下并行处理和批处理。但我想你的解释是正确的。续。因为瓶颈是我拥有的文件数量,所以无论我有多少线程,一次只能有一个线程写入一个文件。所以我想每种文件方法的flagor信号量与缓冲区相结合会更好。您不需要索引列表来并行处理它。只需独立地遍历每个线程中的列表,并忽略一些元素。如果密钥均匀分布,则不需要负载平衡。