标签: parallel-processing

Haskell中的并行monad地图?像parMapM这样的东西?

我正在寻找一种在ST-Monad中并行运行两个计算的方法.我正在构建一个相当大的数组(使用STUArray),我想并行执行.

到目前为止,我已经在stackoverflow上找到了这个这个 Q&A,但是第一个不适用于我的情况,因为它只处理纯代码而第二个处理IO monad - 但我处于State Thread中.

我也找到了monad-parallel包,但它要求我为ST设置一个'MonadParallel'实例.另外,单子面值包中只支持纯计算或IO单子.

有没有办法在ST内进行并行monadic计算?

parallel-processing monads haskell state-monad

11
推荐指数
1
解决办法
1082
查看次数

并行化一个while循环,数组从bash中的文件读取

我在Bash中有一个while循环处理如下:

while IFS=$'\t' read -r -a line;
do
    myprogram ${line[0]} ${line[1]} ${line[0]}_vs_${line[1]}.result;
done < fileinput
Run Code Online (Sandbox Code Playgroud)

它从具有此结构的文件中读取,以供参考:

foo   bar
baz   foobar
Run Code Online (Sandbox Code Playgroud)

等等(制表符分隔).

我想使用GNU parallel并行化这个循环(因为条目很多,处理速度很慢),但是我不知道如何将每一行分配给数组,就像我在这里做的那样.

什么是可能的解决方案(GNU并行工作的替代方案)?

parallel-processing bash gnu-parallel

11
推荐指数
3
解决办法
7542
查看次数

最佳Spring批量扩展策略

我们有简单的批处理工作,工作正常.最近,我们有新的需求来实现新的批处理以生成报告.我们有差异的数据源来阅读以准备此报告.具体来说,每个报告可能有一个视图.

现在我们希望以这样一种方式扩展这个过程,它可以扩展并尽早完成.

我熟悉多线程步骤但不确定其他策略(远程分块和分区步骤)以及何时使用.

在我们的案例中,处理+写入文件是更多的资源激励然后阅读.

在这种情况下哪种方法最适合.

或者,如果我们发现db中的读取数据与写入+处理到文件的资源激励相同,那么我们必须改进/扩展此过程的最佳选择是什么.

parallel-processing spring scalability spring-batch

11
推荐指数
1
解决办法
1万
查看次数

什么是并行计算的规范示例?

我正在写一篇论文来测试一个新的应用程序,它将演示并行计算的好处(与此应用程序的传统序列化版本相比).我想在我的论文中使用规范的并行计算示例.

我的第一个例子是pi的并行计算.理想情况下,我希望每个迭代非常耗时(因为与并行化相关的额外开销); 我的第一个想法是使用MCMC和Gibbs采样的贝叶斯模拟.

在这种情况下通常会讨论哪些其他问题?什么是大型令人尴尬的并行问题的好例子?

parallel-processing mpi

10
推荐指数
3
解决办法
2230
查看次数

Parallel.For在大约137​​0次迭代后冻结,不知道为什么

我在7500多个对象上运行一个Parallel.For循环.在for循环中,我正在为每个对象做很多事情,特别是调用两个Web服务和两个内部方法.Web服务只是检查对象,处理并返回一个字符串,然后我将其设置为对象上的属性.两种内部方法也是如此.

我没有写任何东西到磁盘或从磁盘读取.

我还在带有标签和进度条的winforms应用程序中更新UI,以便让用户知道它在哪里.这是代码:

var task = Task.Factory.StartNew(() =>
{
  Parallel.For(0, upperLimit, (i, loopState) =>
  {
     if (cancellationToken.IsCancellationRequested)
        loopState.Stop();
     lblProgressBar.Invoke(
       (Action)
       (() => lblProgressBar.Text = string.Format("Processing record {0} of {1}.", (progressCounter++), upperLimit)));
     progByStep.Invoke(
       (Action)
       (() => progByStep.Value = (progressCounter - 1)));

      CallSvc1(entity[i]);
      Conversion1(entity[i]);
      CallSvc2(entity[i]);
      Conversion2(entity[i]);
  });
}, cancellationToken);
Run Code Online (Sandbox Code Playgroud)

这是在Win7 32位机器上进行的.

关于为什么当增量器大约在1370左右时突然冻结的任何想法(这是1361,1365和1371)?

关于如何调试这个并看看有什么锁定的任何想法?

编辑:
以下评论的一些答案:
@BrokenGlass - 不,没有互操作.我将尝试x86编译并让你知道.

@chibacity - 因为它是在后台任务上,所以它不会冻结UI.直到它冻结的时间,进度条和标签每秒大约2点.当它冻结时,它就会停止移动.我可以验证它停止的号码是否已被处理,但不再处理.双核2.2GHz的CPU使用率在运行期间最低,每次3-4%,冻结后1-2%.

@Henk Holterman - 到达1360需要大约10-12分钟,是的,我可以验证所有这些记录是否已经处理但不是剩余的记录.

@CodeInChaos - 谢谢,我会试试!如果我拿出并行代码,代码确实有用,它只需要一天又一天.我没有尝试过限制线程数,但是会.

编辑2:
关于Web服务发生了什么的一些细节

基本上,Web服务正在发生的是它们传递一些数据并接收数据(XmlNode).然后在Conversion1进程中使用该节点,该进程又在实体上设置另一个属性,该属性被发送到CallSvc2方法,依此类推.它看起来像这样:

private void CallSvc1(Entity entity)
{
    var svc = new MyWebService();
    var …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing freeze task-parallel-library

10
推荐指数
2
解决办法
2272
查看次数

Makefile在后台运行进程

我在Makefile中有这个:

run:
     for x in *.bin ; do ./$$x ; done
Run Code Online (Sandbox Code Playgroud)

这样它就可以逐个启动所有可执行文件.我想做这个:

run:
     for x in *.bin ; do ./$$x &; done
Run Code Online (Sandbox Code Playgroud)

这样它就会启动每个可执行文件并将其放在后台.当我放入&符号时,上面的语句出现语法错误.

我不想调用make,make &因为这将在后台运行进程但仍然是一个接一个,而我希望单个可执行文件在后台运行,这样在任何时刻我都有多个可执行文件在运行.

先感谢您.

parallel-processing makefile

10
推荐指数
2
解决办法
1万
查看次数

有人可以向我解释以下os.fork()示例吗?

[代码取自Mark Lutz编程Python第4版]

"forks child processes until you type 'q'"
import os
def child():
    print('Hello from child', os.getpid())
    os._exit(0) # else goes back to parent loop

def parent():
    while True:
        newpid = os.fork()
        if newpid == 0:
            child()
        else:
            print('Hello from parent', os.getpid(), newpid)
        if input() == 'q': break

parent()
Run Code Online (Sandbox Code Playgroud)

运行时代码输出的内容:

Hello from parent 2057 2062 
Hello from child 2062

Hello from parent 2057 2068 
Hello from child 2068

Hello from parent 2057 2069 
Hello from child 2069

Hello from parent …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing

10
推荐指数
1
解决办法
1万
查看次数

如何提高这种算法的性能?

我有一个100000对的文本文件:单词和频率.

test.in文件包含单词:

  • 1行 - 所有字频对的总数
  • 2行~100 001 - 字频对
  • 100 002行 - 用户输入字的总数
  • 从100 003到最后 - 用户输入的单词

我解析这个文件并把文字放进去

Dictionary<string,double> dictionary;
Run Code Online (Sandbox Code Playgroud)

我想在以下代码中执行一些搜索+命令逻辑:

for(int i=0;i<15000;i++)
{
    tempInputWord = //take data from file(or other sources)

    var adviceWords = dictionary
                .Where(p => p.Key.StartsWith(searchWord, StringComparison.Ordinal))
                .OrderByDescending(ks => ks.Value)
                .ThenBy(ks => ks.Key,StringComparer.Ordinal)
                .Take(10)
                .ToList();

    //some output
}
Run Code Online (Sandbox Code Playgroud)

问题:此代码必须在不到10秒的时间内运行.

在我的计算机(核心i5 2400,8gb RAM)上使用Parallel.For() - 大约91秒.

你能给我一些如何提高性能的建议吗?

更新:

万岁!我们做到了!谢谢@CodesInChaos,@ usr,@ T_D以及参与解决问题的所有人.

最终代码:

var kvList = dictionary.OrderBy(ks => ks.Key, StringComparer.Ordinal).ToList();

var strComparer = new MyStringComparer();
var intComparer = …
Run Code Online (Sandbox Code Playgroud)

.net c# parallel-processing performance dictionary

10
推荐指数
2
解决办法
1498
查看次数

使用s3cmd并行将文件上载到s3

我在服务器上有一大堆文件,我想将它们上传到S3.这些文件以.data扩展名存储,但实际上它们只是一堆jpeg,png,zip或pdf.

我已经编写了一个简短的脚本,它找到了mime类型并将它们上传到S3上,但是它运行起来很慢.有没有办法使用gnu parallel进行下面的运行?

#!/bin/bash

for n in $(find -name "*.data") 
do 
        data=".data" 
        extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'` 
        mimetype=`file --mime-type $n | cut -d ' ' -f2`
        fullpath=`readlink -f $n`

        changed="${fullpath/.data/.$extension}"

        filePathWithExtensionChanged=${changed#*internal_data}

        s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged     

        response=`$s3upload`
        echo $response 

done 
Run Code Online (Sandbox Code Playgroud)

此外,我确信这个代码一般可以大大改进:)反馈提示将不胜感激.

parallel-processing bash amazon-s3 s3cmd gnu-parallel

10
推荐指数
1
解决办法
6096
查看次数

在64位机器上,我可以安全地并行操作64位四字的单个字节吗?

背景

我正在对图像中的行和列进行并行操作.我的图像是8位或16位像素,我在64位机器上.当我对并行的列进行操作时,两个相邻的列可以共享相同的32位int或64位long.基本上,我想知道我是否可以安全地并行操作同一个四字的单个字节.

最小的测试

我写了一个我无法失败的最小测试函数.对于64位中的每个字节long,我同时在有限的有序域中执行连续的乘法p.我知道费马的小定理 a^(p-1) = 1 mod p何时p是素数.我改变了值ap我的8个线程中的每一个,并执行k*(p-1)乘法运算a.当线程完成每个字节应该是1.事实上,我的测试用例通过了.每次运行时,我都会得到以下输出:

8
101010101010101
101010101010101

我的系统是Linux 4.13.0-041300-generic x86_64,带有8核Intel(R)Core(TM)i7-7700HQ CPU @ 2.80GHz.我用g ++ 7.2.0 -O2编译并检查了程序集.我添加了"INNER LOOP"的程序集并对其进行了评论.在我看来,生成的代码是安全的,因为存储只是将低8位写入目标而不是进行一些按位算术并存储到整个字或四字.g ++ -O3生成了类似的代码.

题:

我想知道这段代码是否始终是线程安全的,如果没有,它将在什么条件下不会.也许我是非常偏执,但我觉得我需要一次操作四字,以确保安全.

#include <iostream>
#include <pthread.h>

class FermatLTParams
{
public:
    FermatLTParams(unsigned char *_dst, unsigned int _p, unsigned int _a, unsigned int _k)
        : dst(_dst), p(_p), a(_a), k(_k) {}

    unsigned char …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing multithreading x86-64 image-processing

10
推荐指数
1
解决办法
169
查看次数