在与Google的一位朋友交谈后,我想实现某种Job/Worker模型来更新我的数据集.
此数据集镜像第三方服务的数据,因此,要进行更新,我需要对其API进行多次远程调用.我认为将花费大量时间等待第三方服务的回复.我想加快速度,更好地利用我的计算时间,通过并行化这些请求并同时保持其中许多请求,等待他们的个人响应.
在我解释我的特定数据集并解决问题之前,我想澄清一下我正在寻找的答案:
好的,现在进入细节:
数据集由拥有最喜欢的项目并跟随其他用户的用户组成.目的是能够更新每个用户的队列 - 用户在加载页面时将看到的项目列表,基于她所关注的用户的最喜欢的项目.但是,在我可以处理数据并更新用户队列之前,我需要确保拥有最新的数据,这是API调用的来源.
我可以拨打两个电话:
在我打电话给跟随用户更新用户之后,我需要为每个被关注的用户更新喜欢的项目.仅当为所有被跟踪的用户返回所有收藏夹时,才能开始处理该原始用户的队列.此流程如下:

此流程中的工作包括:
所以,我的问题是:
感谢阅读,我期待与大家进行一些讨论.
编辑,以回应JimR:
谢谢你的回复.在我写完原始问题后的阅读中,我已经倾向于使用MapReduce了.我还没有确定如何构建它,但我开始觉得MapReduce更适合分发/并行化计算负载,而我真的只是想要并行化HTTP请求.
什么是我的"减少"任务,即获取所有获取数据并将其压缩成结果的部分,并不是计算密集型的.我很确定它会成为一个大的SQL查询,每个用户执行一两秒钟.
所以,我倾向于:
我有一堆在JUnit测试套件中组织的测试.这些测试大大利用硒来测试Web应用程序.因此,对于硒来说,这些测试的运行时间很长.由于套件中的测试类由于测试数据库中的某些重叠而无法并行运行,因此我希望并行运行套件.
JUnit ParallelComputer只能并行执行类或方法级别的测试,JUnit是否有任何标准方法可以使用套件?
如果我只是将套件类传递给junit runner并将计算机配置为在类级别进行并行化,那么它会选择测试类本身,而不是套件.
弗兰克
我正在尝试决定使用哪个并行调试器.到目前为止,我发现没有很多开源的,所以我的选择是:
你推荐哪一个?还有什么值得的吗?
我刚刚开始学习并行编程,我正在研究二进制搜索.
通过投入更多的处理器,这无法真正优化吗?我知道这应该是分裂和征服,但你真的"正在减少和征服"(来自维基百科).
或者你可以将这些比较并行化吗?(如果X是小于array[mid],从搜索low到mid - 1;否则,如果X是大于array[mid]从搜索mid + 1到high,否则返回mid,的指数X)
或者你将一半的数组放到一个处理器上进行二进制搜索,另一半到另一个处理器怎么样?这不是浪费吗?因为它正在减少和征服而不是简单地分裂和征服?思考?
我们需要处理的各种目录中有大约500GB的图像.每个图像的大小约为4MB,我们有一个python脚本,一次处理一个图像(它读取元数据并将其存储在数据库中).每个目录可能需要1-4小时才能处理,具体取决于大小.
我们可以在GNU/Linux操作系统上使用2.2Ghz四核处理器和16GB RAM.当前脚本仅使用一个处理器.利用其他内核和RAM来更快地处理图像的最佳方法是什么?启动多个Python进程来运行脚本会利用其他内核吗?
另一个选择是使用Gearman或Beanstalk之类的东西将工作分配给其他机器.我已经看了多处理库但不知道如何利用它.
我正在使用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) 我有一个返回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中.它看起来如何的一个例子是 …
我正在寻找一种在ST-Monad中并行运行两个计算的方法.我正在构建一个相当大的数组(使用STUArray),我想并行执行.
到目前为止,我已经在stackoverflow上找到了这个和这个 Q&A,但是第一个不适用于我的情况,因为它只处理纯代码而第二个处理IO monad - 但我处于State Thread中.
我也找到了monad-parallel包,但它要求我为ST设置一个'MonadParallel'实例.另外,单子面值包中只支持纯计算或IO单子.
有没有办法在ST内进行并行monadic计算?
我在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并行工作的替代方案)?
我们有简单的批处理工作,工作正常.最近,我们有新的需求来实现新的批处理以生成报告.我们有差异的数据源来阅读以准备此报告.具体来说,每个报告可能有一个视图.
现在我们希望以这样一种方式扩展这个过程,它可以扩展并尽早完成.
我熟悉多线程步骤但不确定其他策略(远程分块和分区步骤)以及何时使用.
在我们的案例中,处理+写入文件是更多的资源激励然后阅读.
在这种情况下哪种方法最适合.
或者,如果我们发现db中的读取数据与写入+处理到文件的资源激励相同,那么我们必须改进/扩展此过程的最佳选择是什么.
haskell ×2
java ×2
python ×2
bash ×1
debugging ×1
distributed ×1
gnu-parallel ×1
go ×1
io ×1
junit ×1
mapreduce ×1
monads ×1
mpi ×1
optimization ×1
performance ×1
scalability ×1
spring ×1
spring-batch ×1
state-monad ×1
suite ×1