标签: parallel-processing

我是否应该学习/使用MapReduce或其他类型的并行化来执行此任务?

在与Google的一位朋友交谈后,我想实现某种Job/Worker模型来更新我的数据集.

此数据集镜像第三方服务的数据,因此,要进行更新,我需要对其API进行多次远程调用.我认为将花费大量时间等待第三方服务的回复.我想加快速度,更好地利用我的计算时间,通过并行化这些请求并同时保持其中许多请求,等待他们的个人响应.

在我解释我的特定数据集并解决问题之前,我想澄清一下我正在寻找的答案:

  1. 这是一个非常适合与MapReduce并行化的流程吗?
  2. 如果是的话,在亚马逊的mapreduce模块上运行是否具有成本效益,该模块按小时计费,并在作业完成时向上计算小时数?(我不确定究竟什么算作"工作",所以我不确切知道我将如何收费)
  3. 如果不是,我应该使用另一种系统/模式吗?是否有一个库,这将有助于我在Python做到这一点(在AWS上,usign EC2 + EBS)?
  4. 我在设计这个工作流程时遇到了什么问题?

好的,现在进入细节:

数据集由拥有最喜欢的项目并跟随其他用户的用户组成.目的是能够更新每个用户的队列 - 用户在加载页面时将看到的项目列表,基于她所关注的用户的最喜欢的项目.但是,在我可以处理数据并更新用户队列之前,我需要确保拥有最新的数据,这是API调用的来源.

我可以拨打两个电话:

  • 获取关注用户 - 返回所请求用户所遵循的所有用户,以及
  • 获取收藏的项目 - 返回所请求用户的所有喜爱的项目.

在我打电话给跟随用户更新用户之后,我需要为每个被关注的用户更新喜欢的项目.仅当为所有被跟踪的用户返回所有收藏夹时,才能开始处理该原始用户的队列.此流程如下:

更新UserX的队列

此流程中的工作包括:

  • 开始为用户更新队列 - 通过提取用户,然后更新用户,存储它们,然后为每个用户创建获取收藏夹作业来启动流程.
  • 获取用户的收藏夹 - 来自第三方服务的请求和存储,指定用户的收藏夹列表.
  • 为用户计算新队列 - 现在已经获取了所有数据,处理新队列,然后将结果存储在应用程序层使用的缓存中.

所以,我的问题是:

  1. 这是一个非常适合与MapReduce并行化的流程吗?我不知道它是否会让我启动UserX的进程,获取所有相关数据,并在完成所有操作后返回处理UserX的队列.
  2. 如果是的话,在亚马逊的mapreduce模块上运行是否具有成本效益,该模块按小时计费,并在作业完成时向上计算小时数?如果我使用他们的模块,我有多少"线程"可以等待开放的API请求?
  3. 如果不是,我应该使用另一种系统/模式吗?是否有一个库,这将有助于我在Python做到这一点(在AWS上,usign EC2 + EBS?)?
  4. 我在设计这个工作流程时遇到了什么问题?

感谢阅读,我期待与大家进行一些讨论.

编辑,以回应JimR:

谢谢你的回复.在我写完原始问题后的阅读中,我已经倾向于使用MapReduce了.我还没有确定如何构建它,但我开始觉得MapReduce更适合分发/并行化计算负载,而我真的只是想要并行化HTTP请求.

什么是我的"减少"任务,即获取所有获取数据并将其压缩成结果的部分,并不是计算密集型的.我很确定它会成为一个大的SQL查询,每个用户执行一两秒钟.

所以,我倾向于:

  • Python编写的非MapReduce Job/Worker模型.我的一个谷歌朋友让我为此学习Python,因为它的开销很低,并且可以很好地扩展.
  • 使用Amazon EC2作为计算层.我想这意味着我还需要一个EBS切片来存储我的数据库.
  • 可能使用亚马逊的简单消息队列.听起来这个第三个亚马逊小部件旨在跟踪作业队列,将结果从一个任务移动到另一个任务的输入,并优雅地处理失败的任务.它很便宜.可能值得实现而不是自定义作业队列系统.

python parallel-processing mapreduce amazon-web-services

11
推荐指数
2
解决办法
1086
查看次数

在套件级别上并行运行JUnit测试?

我有一堆在JUnit测试套件中组织的测试.这些测试大大利用硒来测试Web应用程序.因此,对于硒来说,这些测试的运行时间很长.由于套件中的测试类由于测试数据库中的某些重叠而无法并行运行,因此我希望并行运行套件.

JUnit ParallelComputer只能并行执行类或方法级别的测试,JUnit是否有任何标准方法可以使用套件?

如果我只是将套件类传递给junit runner并将计算机配置为在类级别进行并行化,那么它会选择测试类本身,而不是套件.

弗兰克

java parallel-processing junit automated-tests suite

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

并行调试器

我正在尝试决定使用哪个并行调试器.到目前为止,我发现没有很多开源的,所以我的选择是:

你推荐哪一个?还有什么值得的吗?

debugging parallel-processing distributed mpi

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

并行二进制搜索

我刚刚开始学习并行编程,我正在研究二进制搜索.

通过投入更多的处理器,这无法真正优化吗?我知道这应该是分裂和征服,但你真的"正在减少和征服"(来自维基百科).

或者你可以将这些比较并行化吗?(如果X是小于array[mid],从搜索lowmid - 1;否则,如果X是大于array[mid]从搜索mid + 1high,否则返回mid,的指数X)

或者你将一半的数组放到一个处理器上进行二进制搜索,另一半到另一个处理器怎么样?这不是浪费吗?因为它正在减少和征服而不是简单地分裂和征服?思考?

parallel-processing binary-search

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

在Python中处理大型文件的最快方法

我们需要处理的各种目录中有大约500GB的图像.每个图像的大小约为4MB,我们有一个python脚本,一次处理一个图像(它读取元数据并将其存储在数据库中).每个目录可能需要1-4小时才能处理,具体取决于大小.

我们可以在GNU/Linux操作系统上使用2.2Ghz四核处理器和16GB RAM.当前脚本仅使用一个处理器.利用其他内核和RAM来更快地处理图像的最佳方法是什么?启动多个Python进程来运行脚本会利用其他内核吗?

另一个选择是使用Gearman或Beanstalk之类的东西将工作分配给其他机器.我已经看了多处理库但不知道如何利用它.

python parallel-processing optimization

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

多线程程序没有加速

我正在使用Go语言并发,发现了一些对我来说不透明的东西.

我写了并行矩阵乘法,也就是说,每个任务计算产品矩阵的单行,乘以源矩阵的相应行和列.

这是Java程序

public static double[][] parallelMultiply(int nthreads, final double[][] m1, final double[][] m2) {
    final int n = m1.length, m = m1[0].length, l = m2[0].length;
    assert m1[0].length == m2.length;

    double[][] r = new double[n][];

    ExecutorService e = Executors.newFixedThreadPool(nthreads);
    List<Future<double[]>> results = new LinkedList<Future<double[]>>();
    for (int ii = 0; ii < n; ++ii) {
        final int i = ii;
        Future<double[]> result = e.submit(new Callable<double[]>() {
            public double[] call() throws Exception {
                double[] row = new double[l];
                for (int j = …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing performance multithreading go

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

并行排序IO操作

我有一个返回IO动作的函数,

f :: Int -> IO Int
Run Code Online (Sandbox Code Playgroud)

我想为参数的多个值并行计算这个函数.我天真的实施如下:

import Control.Parallel.Strategies

vals = [1..10]
main = do
      results <- mapM f vals
      let results' = results `using` parList rseq
      mapM_ print results'
Run Code Online (Sandbox Code Playgroud)

我给这理由是,第一mapM结合型的东西IO [Int]results,results'应用并行的策略所包含的名单,并mapM_通过打印,最后请求的实际值-但究竟是要打印并行已经引起的,所以程序应并行.

在确实使用了我所有的CPU之后感到高兴,我注意到程序在运行时效果较差(如挂钟时间),而+RTS -N8不是没有任何RTS标志.我能想到的唯一解释是,第一个mapM必须排序 - 即执行 - 所有IO操作已经,但这不会导致无效,但使N8执行与非平行的一样有效,因为所有的工作都由主线程.以+RTS -N8 -s收益率运行程序SPARKS: 36 (11 converted, 0 overflowed, 0 dud, 21 GC'd, 4 fizzled),这肯定不是最优的,但不幸的是我无法理解它.

我想我已经在Haskell并行化或IO monad的内部找到了初学者的垫脚石之一.我究竟做错了什么?

背景信息:f n是一个返回Project Euler问题n的解决方案的函数.由于其中许多都有要读取的数据,因此我将结果放入IO monad中.它看起来如何的一个例子是 …

io parallel-processing haskell

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

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万
查看次数