标签: parallel-processing

查询成本与执行速度+并行度

我的部门最近被我们的IT部门谴责(很好地)以非常高的成本运行查询,前提是我们的查询有可能破坏数据库的稳定和/或崩溃.我们都不是DBA的; 只是研究人员编写和执行对数据库的查询,我可能是唯一一个在谴责之前查看过解释计划的人.

我们被告知超过100的查询成本应该是非常罕见的,并且永远不应该运行成本超过1000的查询.我遇到的问题是成本似乎与执行时间无关,而且在尝试优化查询时我会失去工作效率.

作为一个例子,我有一个查询,在5秒内执行,成本为10844.我重写了查询以使用包含我需要的大部分信息的视图,并将成本降低到109,但新查询,它检索相同的结果,需要40秒才能运行.我在这里找到了一个可能的解释:

衡量查询效果:"执行计划查询成本"与"拍摄时间"

那个问题让我得到了并行性的暗示.我尝试/*+ no_parallel*/在成本10884查询中使用,但成本没有改变,也没有执行时间,所以我不确定并行性是解释更快的执行时间但更高的成本.然后,我尝试使用/*+ parallel(n)*/提示,发现值越高n,查询的成本就越低.在成本为10844查询的情况下,我发现/*+ parallel(140)*/将成本降低到97,执行时间略有增加.

这似乎是满足我们IT部门提出的要求的理想"作弊",但后来我读到了这个:

http://www.oracle.com/technetwork/articles/datawarehouse/twp-parallel-execution-fundamentals-133639.pdf

这篇文章包含这句话:

并行执行可以使单个操作利用所有系统资源.

所以,我的问题是:

我实际上是通过使用/*+ parallel(n)*/具有高度并行性的提示来增加服务器资源的压力,即使我降低了成本?

假设没有并行性,执行速度是否比成本更好地衡量所使用的资源?

sql oracle parallel-processing query-optimization

5
推荐指数
1
解决办法
2221
查看次数

R Studio Server:多个AWS EC2节点

我可以使用ForEach和DoSnow包在R Studio中并行运行代码.我可以轻松启动运行R Studio Server的32核AWS EC2实例,并使用以下代码并行运行代码:

cl<-makeCluster(32) 
registerDoSNOW(cl)
foreach () %dopar% {}
Run Code Online (Sandbox Code Playgroud)

但是,单个AWS EC2实例上的最大核心数为32.如何在多个AWS EC2节点上使用相同的确切代码并使用所有核心?

例如,假设我想在4个AWS EC2上并行运行相同的代码,这将使用128个内核,这样的实例:

cl<-makeCluster(128) 
registerDoSNOW(cl)
foreach () %dopar% {}
Run Code Online (Sandbox Code Playgroud)

是否有一些简单的方法可以将多个EC2实例"绑定"在一起,以便R Studio Server,ForEach和DoSnow将这128个核心视为一个EC2实例?

parallel-processing r

5
推荐指数
0
解决办法
563
查看次数

ImageMagick转换和GNU并行在一起

我想加快以下命令:

convert -limit memory 64 -limit map 128 -antialias -delay 1x2 final/*.png movie.mp4
Run Code Online (Sandbox Code Playgroud)

我看过其他博客文章,其中并行和转换一起使用,所以我想知道如何使它与上面的命令一起使用.

parallel-processing gnu imagemagick imagemagick-convert

5
推荐指数
1
解决办法
2574
查看次数

bash脚本并行ssh远程命令

我有一个脚本,通过ssh连接在几台不同的机器上触发远程命令.脚本如下:

for server in list; do
echo "output from $server"
ssh to server execute some command
done
Run Code Online (Sandbox Code Playgroud)

这个问题显然是时间,因为它需要建立ssh连接,fire命令,等待答案,打印它.我想要的是让脚本尝试一次建立连接并返回echo"$ server的输出"并在命令输出后立即输出,所以在列表顺序中没有必要.

我一直在谷歌上搜索一段时间,但没有找到答案.我不能在命令运行后取消ssh会话作为一个线程建议,因为我需要一个输出,我不能使用其他线程中建议的并行gnu.另外我不能使用任何其他工具,我不能在这台机器上带任何东西,只有可用的工具是GNU bash,版本4.1.2(1) - 发布.

另一个问题是这样的ssh会话有限吗?如果我只是粘贴5个左右的"ssh connect"行,做一些命令"它实际上什么都不做,或者只在列表中首先执行.(如果我粘贴3-4行就可以了).谢谢

parallel-processing ssh bash

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

使用Python Multiprocessing从令人尴尬的并行任务中获得预期的加速

我正在学习使用Python的Multiprocessing软件包来解决令人尴尬的并行问题,因此我编写了串行和并行版本来确定小于或等于自然数n的素数的数量.根据我从博客文章Stack Overflow问题中读到的内容,我想出了以下代码:

串行

import math
import time

def is_prime(start, end):
    """determine how many primes within given range"""
    numPrime = 0
    for n in range(start, end+1):
        isPrime = True
        for i in range(2, math.floor(math.sqrt(n))+1):
            if n % i == 0:
                isPrime = False
                break
        if isPrime:
            numPrime += 1
    if start == 1:
        numPrime -= 1  # since 1 is not prime
    return numPrime

if __name__ == "__main__":
    natNum = 0
    while natNum < 2: …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing embarrassingly-parallel parallelism-amdahl python-multiprocessing

5
推荐指数
1
解决办法
1677
查看次数

在并行模式下运行具有多个参数的R函数

我有这个功能

function1 <- function(df1, df2, int1, int2, char1)
{
...
return(newDataFrame)
}
Run Code Online (Sandbox Code Playgroud)

它有5个输入:前2个是数据帧,然后我有两个整数和一个字符串.该函数返回一个新的数据框.

到目前为止,我依次运行此函数8次:

newDataFrame1 <- function1(df1, df2, 1, 1, "someString")
newDataFrame2 <- function1(df1, df2, 2, 0, "someString")
newDataFrame3 <- function1(df1, df2, 3, 0, "someString")
newDataFrame4 <- function1(df1, df2, 4, 0, "someString")
newDataFrame5 <- function1(df1, df2, 5, 0, "someString")
newDataFrame6 <- function1(df1, df2, 6, 0, "someString")
newDataFrame7 <- function1(df1, df2, 7, 0, "someString")
newDataFrame8 <- function1(df1, df2, 8, 0, "someString")
Run Code Online (Sandbox Code Playgroud)

最后我使用rbind()组合结果:

newDataFrameTot <-  rbind(newDataFrame1, newDataFrame2, newDataFrame3, newDataFrame4, newDataFrame5, newDataFrame6, newDataFrame7, …
Run Code Online (Sandbox Code Playgroud)

parallel-processing parameters performance r dataframe

5
推荐指数
2
解决办法
2116
查看次数

使用Delphi XE7并行库

我有一个耗时的例程,我想使用Delphi XE7的新并行库并行处理.

这是单线程版本:

procedure TTerritoryList.SetUpdating(const Value: boolean);
var
  i, n: Integer;
begin
  if (fUpdating <> Value) or not Value then
  begin
    fUpdating := Value;

    for i := 0 to Count - 1 do
    begin
      Territory[i].Updating := Value; // <<<<<< Time consuming routine
      if assigned(fOnCreateShapesProgress) then
        fOnCreateShapesProgress(Self, 'Reconfiguring ' + Territory[i].Name, i / (Count - 1));
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

实际上并没有什么复杂的事情发生.如果区域列表变量已更改或设置为false,则例程将循环遍历所有销售区域并重新创建区域边界(这是一项耗时的任务).

所以这是我试图让它平行:

procedure TTerritoryList.SetUpdating(const Value: boolean);
var
  i, n: Integer;
begin
  if (fUpdating <> Value) or not Value then
  begin
    fUpdating := …
Run Code Online (Sandbox Code Playgroud)

delphi parallel-processing multithreading tthread

5
推荐指数
1
解决办法
5000
查看次数

如何使用OpenMP并行化这个数组和?

如何使用OpenMP并行化这个数组和?什么应该分享,什么应该是私人的?

这是数组和的代码..

main()         
{        
    int a[10], i, n, sum=0;    

    printf("enter no. of elements");
    scanf("%d",&n); 
    printf("enter the elements");   

    for(i=0;i<n;i++)    
        scanf("%d",&a[i]);

    for (i=0;i<n;i++)
        sum=sum+a[i];

    for(i=0;i<n;i++)
        printf("\n a[%d] = %d", i, a[i]);

    printf("\n sum = %d",sum);

}
Run Code Online (Sandbox Code Playgroud)

c arrays parallel-processing openmp

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

为什么Matlab 2014a/b中的TreeBagger只使用并行池中的少数工作者?

我正在使用TreeBaggerMatlab(R2014a&b)提供的类,与分布式计算工具箱一起使用.我local在拥有40个内核的Windows 7计算机上运行了一个有30名工作人员的集群.

我调用TreeBagger构造函数来生成一个回归林(一个包含32个树的集合),传递一个set为的options结构.'UseParallel''always'

但是,TreeBagger似乎只使用了可用的30个左右的工作者(根据每个进程的CPU使用情况来判断,使用任务管理器观察).当我尝试使用简单的parfor循环测试池时:

parfor i=1:30
    a = fft(rand(20000));
end
Run Code Online (Sandbox Code Playgroud)

然后所有30名工人都参与其中.

我的问题是:(如何)我可以强制TreeBagger使用所有可用资源?

parallel-processing matlab distributed-computing random-forest

5
推荐指数
1
解决办法
453
查看次数

并行*在功能内

我想在函数中使用plyr包的并行功能.

我原本以为导出在函数体内创建的对象的正确方法(在本例中,对象是df_2)如下

# rm(list=ls())
library(plyr)
library(doParallel)

workers=makeCluster(2)
registerDoParallel(workers,core=2)

plyr_test=function() {
  df_1=data.frame(type=c("a","b"),x=1:2)
  df_2=data.frame(type=c("a","b"),x=3:4)

  #export df_2 via .paropts  
  ddply(df_1,"type",.parallel=TRUE,.paropts=list(.export="df_2"),.fun=function(y) {
    merge(y,df_2,all=FALSE,by="type")
  })
}
plyr_test()
stopCluster(workers)
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误

Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : 
  unable to find variable "df_2"
Run Code Online (Sandbox Code Playgroud)

所以我做了一些研究,发现如果我df_2手动导出它就可以了

workers=makeCluster(2)
registerDoParallel(workers,core=2)

plyr_test_2=function() {
  df_1=data.frame(type=c("a","b"),x=1:2)
  df_2=data.frame(type=c("a","b"),x=3:4)

  #manually export df_2
  clusterExport(cl=workers,varlist=list("df_2"),envir=environment())

  ddply(df_1,"type",.parallel=TRUE,.fun=function(y) {
    merge(y,df_2,all=FALSE,by="type")
  })
}
plyr_test_2()
stopCluster(workers)
Run Code Online (Sandbox Code Playgroud)

它给出了正确的结果

  type x.x x.y
1    a   1   3
2    b   2   4
Run Code Online (Sandbox Code Playgroud)

但我也发现以下代码有效

workers=makeCluster(2)
registerDoParallel(workers,core=2)

plyr_test_3=function() {
  df_1=data.frame(type=c("a","b"),x=1:2)
  df_2=data.frame(type=c("a","b"),x=3:4)

  #no …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r plyr

5
推荐指数
1
解决办法
1646
查看次数