我读过有关该主题的类似问题,但没有一个可以帮助我解决以下问题:
我有一个 bash 脚本,如下所示:
#!/bin/bash
for filename in /home/user/Desktop/emak/*.fa; do
mkdir ${filename%.*}
cd ${filename%.*}
mkdir emak
cd ..
done
Run Code Online (Sandbox Code Playgroud)
该脚本基本上执行以下操作:
真正的任务执行比创建“emak”文件更昂贵的计算......
我有大约数千个文件需要迭代。由于每次迭代都独立于前一次迭代,因此我希望将其拆分到不同的处理器(我有 24 个核心)中,这样我就可以同时处理多个文件。
我读过一些关于并行运行的文章(使用:GNU),但我没有看到在这种情况下应用它的明确方法。
谢谢
我有一个大型数据库(~100Gb),我需要从中提取每个条目,对其执行一些比较,然后存储这些比较的结果。我尝试在单个 R 会话中运行并行查询,但没有成功。我可以同时运行多个 R 会话,但我正在寻找更好的方法。这是我尝试的:
library(RSQLite)
library(data.table)
library(foreach)
library(doMC)
#---------
# SETUP
#---------
#connect to db
db <- dbConnect(SQLite(), dbname="genes_drug_combos.sqlite")
#---------
# QUERY
#---------
# 856086 combos = 1309 * 109 * 6
registerDoMC(8)
#I would run 6 seperate R sessions (one for each i)
res_list <- foreach(i=1:6) %dopar% {
a <- i*109-108
b <- i*109
pb <- txtProgressBar(min=a, max=b, style=3)
res <- list()
for (j in a:b) {
#get preds for drug combos
statement <- paste("SELECT * from combo_tstats …Run Code Online (Sandbox Code Playgroud) 下面您可以在 R 中找到一段代码,我希望将其转换为使用多个 CPU 作为并行进程运行。我尝试使用foreachpackage,但没有走得太远。考虑到我有 3 级嵌套循环,我找不到一个很好的例子如何让它工作。我们将非常感谢您的帮助。下面的代码示例 - 我做了一个简单的函数,因此它可以作为示例:
celnum <- c(10,20,30)
t2 <- c(1,2,3)
allrepeat <- 10
samplefunction <- function(celnum,t2){
x <- rnorm(100,celnum,t2)
y = sample(x, 1)
z = sample(x,1)
result = y+z
result
}
Run Code Online (Sandbox Code Playgroud)
常规方式获取结果:
z_grid <- matrix(, nrow = length(celnum), ncol = length(t2))
repetitions <- matrix(, nrow = allrepeat, ncol = 1)
set.seed=20
for(i in 1:length(celnum)){
for (j in 1:length(t2)){
for (k in 1:allrepeat) {
results <- samplefunction(celnum[i],t2[j])
repetitions[k] <- results
z_grid[i,j] <- mean(repetitions,na.rm=TRUE)
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 prange 迭代这样的列表:
from cython.parallel import prange, threadid
cdef int tid
cdef CythonElement tEl
cdef int a, b, c
# elList: python list of CythonElement instances is passed via function call
for n in prange(nElements, schedule='dynamic', nogil=True):
with gil:
tEl = elList[n]
tid = threadid()
a = tEl.a
b = tEl.b
c = tEl.c
print("thread {:} elnumber {:}".format(tid, tEl.elNumber))
#nothing is done here
with gil:
print("thread {:} elnumber {:}".format(tid, tEl.elNumber))
# some other computations based on a, b and c …Run Code Online (Sandbox Code Playgroud) 我已经使用 Intel IPP 构建了 OpenCV,因此我认为只要有可能就会使用它(例如矩阵乘法)。
我想通过与串行版本进行比较来测试并行应用程序的可扩展性。为了做到这一点,当我这样做时:
omp_set_num_threads(1);
cv::setNumThreads(1);
Run Code Online (Sandbox Code Playgroud)
但是,通过监视 CPU 使用情况,我发现仍然使用多个 CPU。这是为什么?如何仅使用一个CPU强制执行程序?
我有下面的示例,其中两个 goroutine 应该并行运行。但是如果你检查输出,第二个 goroutine 仅在第一个 goroutine 完成后运行。所以,它是顺序的。
\n\n添加 2 个处理器:runtime.GOMAXPROCS(2)也没有帮助。我在 8 核 Mac pro 上运行,这绝对不是硬件问题。\n所以我的问题 - Golang 真的是并行的吗?如何使下面的示例并行运行?
\n\n输出:
\n\nThread 1\nThread 1\n \xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6....\nThread 1\nThread 1\nThread 2\nThread 2\n \xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6....\nThread 2\nThread 2\nRun Code Online (Sandbox Code Playgroud)\n\n去代码:
\n\npackage main\n\nimport (\n "runtime"\n "time"\n)\n\nfunc main() {\n\n runtime.GOMAXPROCS(2)\n\n go func() {\n for i := 0; i < 100; i++ {\n println("Thread 1")\n //time.Sleep(time.Millisecond * 10)\n }\n }()\n\n go func() {\n for i := 0; i < 100; i++ {\n println("Thread 2")\n //time.Sleep(time.Millisecond …Run Code Online (Sandbox Code Playgroud) 我有一个计算时间太长的脚本,我正在尝试并行化其执行。
该脚本基本上循环遍历数据帧的每一行并执行一些计算,如下所示:
my.df = data.frame(id=1:9,value=11:19)
sumPrevious <- function(df,df.id){
sum(df[df$id<=df.id,"value"])
}
for(i in 1:nrow(my.df)){
print(sumPrevious(my.df,my.df[i,"id"]))
}
Run Code Online (Sandbox Code Playgroud)
我开始学习在 R 中并行化代码,这就是为什么我首先想了解如何使用类似 apply 的函数(例如 sapply、lapply、mapply)来做到这一点。
我尝试了多种方法,但到目前为止没有任何效果:
mapply(sumPrevious,my.df,my.df$id) # Error in df$id : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud) 我是 SLURM 新手。assembled_reads/*.sorted.bam我想并行处理文件列表。然而,在下面的代码中,只有一个进程被一遍又一遍地使用。
#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=1-100
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname
for FILE in assembled_reads/*.sorted.bam; do
echo ${FILE}
OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
PLDY=$(awk -F "," '$1=="$FILE"{print $4}' metadata.csv)
PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")
srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
-R scaffs_HAPSgracilaria92_50REF.fasta \
-T HaplotypeCaller \
-I ${${SLURM_ARRAY_TASK_ID}} \
--emitRefConfidence GVCF \
-ploidy $PLDYNUM \
-nt 1 \
-nct 24 …Run Code Online (Sandbox Code Playgroud) 在 Bash 中,我想并行多次调用一个命令,同时捕获所有进程的退出代码。
我知道如何启动并等待它们,但是等待只会给我最后一个进程退出的退出代码。我还需要生命周期较短的进程的退出代码。
不幸的是我没有 bash 4.3,所以wait -n不是一个选项,gnu 并行也不是#3004811中建议的
#16032001几乎问了同样的问题,但也没有提供解决方案。
我目前能想到的唯一方法是编写一个帮助程序脚本,将退出代码存储在文件中,但这听起来不像是一个干净的解决方案。
我有以下 R“应用”语句:
for(i in 1:NROW(dataframe_stuff_that_needs_lookup_from_simulation))
{
matrix_of_sums[,i]<-
apply(simulation_results[,colnames(simulation_results) %in%
dataframe_stuff_that_needs_lookup_from_simulation[i,]],1,sum)
}
Run Code Online (Sandbox Code Playgroud)
所以,我有以下数据结构:
simulation_results:具有列名称的矩阵,用于标识 2000 个模拟(行)的每个可能的所需模拟查找数据。
dataframe_stuff_that_needs_lookup_from_simulation:除其他项外,还包含其值与simulation_results数据结构中的列名称匹配的字段。
matrix_of_sums:运行函数时,一个 2000 行 x 250,000 列(模拟数量 x 正在模拟的项目)结构用于保存模拟结果。
因此,apply 函数正在查找 250,000 个数据集中每行的数据帧列值,计算总和,并将其存储在matrix_of_sums 数据结构中。
不幸的是,这个处理需要很长时间。我已经探索了使用 rowsums 作为替代方案,它已将处理时间减少了一半,但我想尝试多核处理,看看这是否会进一步减少处理时间。有人可以帮我将上面的代码从“apply”转换为“lapply”吗?
谢谢!