我写了一个带有各种函数的Julia模块,我打电话来分析数据.其中一些函数依赖于包,它们包含在文件"NeuroTools.jl"的开头.
module NeuroTools
using MAT, PyPlot, PyCall;
function getHists(channels::Array{Int8,2}...
Run Code Online (Sandbox Code Playgroud)
我拥有的许多函数对于并行运行很有用,所以我编写了一个驱动程序脚本,使用remotecall/fetch将函数映射到不同的线程.要在每个线程上加载函数,我使用-L选项启动Julia以在每个worker上加载我的模块.
julia -p 16 -L NeuroTools.jl parallelize.jl
Run Code Online (Sandbox Code Playgroud)
要将加载的函数放入范围,"parallelize.jl"脚本具有该行
@everywhere using NeuroTools
Run Code Online (Sandbox Code Playgroud)
我的并行函数正常工作并执行,但每个工作线程都会从被覆盖的模块中发出一堆警告.
WARNING: replacing module MAT
WARNING: Method definition read(Union{HDF5.HDF5Dataset, HDF5.HDF5Datatype, HDF5.HDF5Group}, Type{Bool}) in module MAT_HDF5...
(contniues for many lines)
Run Code Online (Sandbox Code Playgroud)
有没有办法以不同的方式加载模块或更改范围以防止所有这些警告?在这个问题上,文档似乎并不完全清楚.
我有一个仪表板视图,它需要来自整个数据库的表的小数据集.我优化了数据库查询(例如删除了子查询).现在有大约20个查询一个接一个地执行,它们从数据库中获取不同的数据集.大多数HQL查询都包含GROUP BY和JOIN子句.使用Spring REST接口,结果将返回到前端.
如何优化自定义查询的执行?我最初的想法是并行运行数据库查询.但是我该如何实现呢?在做了一些研究之后,我找到了注释@Async,它可以并行运行方法.但这是否适用于Hibernate方法?是否总是为@QueryJpaRepository中注释的每个方法创建一个新的数据库会话?运行数据库查询是否会对总体执行时间产生影响?
另一种并行运行数据库调用的方法是将Dashboard调用拆分为几个单独的Ajax调用(每个关注点都有自己的Ajax调用).我不想这样做,因为每次打开仪表板(或者例如更改日期范围)时,都会进行另外20次Ajax调用以获取新数据.同样的问题仍然存在:并行运行SQL查询是否会影响数据库的执行时间?
我目前还没有向数据库添加其他索引.这将是下一件事,我肯定会这样做.但是,我对并行运行查询的性能影响以及如何使用Spring以编程方式实现此问题感兴趣.
我的项目最初是由jHipster(Spring Boot,MariaDB,AngularJS等)生成的.
我正在Nodejs中构建一个服务器来从某个数据库中检索数据.我已经使用异步库一段时间了,并想出了一些事情,比如将瀑布放入并行函数中.
我偶然发现了一个问题,我首先需要执行一个查询,然后在其他可以同时执行的查询中使用该查询的结果.代码看起来像这样:
async.waterfall([
function(callback) {
connection.query( query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
},
async.parallel([
function(resultFromWaterfall,callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
},
function(resultFromWaterfall,callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
}
])
], finalCallback
);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是从瀑布函数访问结果并在并行函数中使用它.
我正在尝试测试一个简单的模块进行并行化。这个模块提供了一个简单的功能run_tasks(tasks, use_multiprocessing)。我的简单测试包括使用MagicMock类生成任务列表,调用run_tasks并测试是否所有模拟都只被调用了一次。
在指定串行运行的情况下,所有模拟都被调用一次。但是,在并行运行的情况下,模拟的呼叫计数为零。我认为这是模拟模块的问题,因为如果任务包含打印语句,则将在串行和并行运行中执行该语句。
这是测试代码(注意:test_run_tasks_in_parallel失败,但test_run_tasks_serially为绿色):
from unittest import TestCase
from mock import mock
from src.stochastic_simulation.util.embarrassing_parallelization import run_tasks
from src.stochastic_simulation.simulation.task import Task
class TestRunTasks(TestCase):
def setUp(self):
self.functions_to_run = [mock.MagicMock() for i in range(0, 9)]
self.test_tasks = [Task(function, None) for function in self.functions_to_run]
def test_run_tasks_in_parallel(self):
run_tasks(self.test_tasks, use_multiprocessing=True)
for function in self.functions_to_run:
function.assert_called_once()
def test_run_tasks_serially(self):
run_tasks(self.test_tasks)
for function in self.functions_to_run:
function.assert_called_once()
Run Code Online (Sandbox Code Playgroud)
这是模块
import multiprocessing as mp
def run_task(task):
task.run()
def run_tasks(tasks, use_multiprocessing=False):
if use_multiprocessing:
available_processors = mp.cpu_count() - …Run Code Online (Sandbox Code Playgroud) 在从EPFL并行编程过程中,4个抽象数据并行提到:Iterator,Builder,Combiner,和Splitter.
我很熟悉Iterator,但从未使用过其他三个.我所看到的其他特征Builder,Combiner和Splitter下scala.collection包.不过,我知道如何在现实世界的发展使用它们,特别是如何在合作与其他收藏品一样使用它们List,Array,ParArray等任何人都可以请给我一些指导和实例?
谢谢!
我正在使用两个data.frames列表,目前运行类似于此的东西(我正在做的简化版本):
df1 <- data.frame("a","a1","L","R","b","c",1,2,3,4)
df2 <- data.frame("a","a1","L","R","b","c",4,4,4,4,4,44)
df3 <- data.frame(7,7,7,7)
df4 <- data.frame(5,5,5,5,9,9)
L1 <- list(df1,df2)
L2 <- list(df3,df4)
myfun <- function(x,y) {
difa = rowSums(abs(x[c(T,F)] - x[c(F,T)]))
difb=sum(abs(as.numeric(y[-c(1:6)])[c(T,F)] - as.numeric(y[-c(1:6)])[c(F,T)]))
diff <- difa + difb
return(diff)
}
output1 <- mapply(myfun, x = L2, y = L1)
Run Code Online (Sandbox Code Playgroud)
每个列表中的数据帧数相同,一个列表中的每个数据帧对应另一个列表中的数据帧.一个列表中的数据帧包含单个行,而第二个列表中的其他数据帧包含动态行数; 因此使用sum和rowSums.数字列的数量也是动态的,但在相应的数据帧之间始终相同.
我希望在处理每个列表1-10万个数据帧时使用并行处理来加速计算.我尝试了以下方法:
library(parallel)
if(detectCores() > 1) {no_cores <- detectCores() - 1}
if(.Platform$OS.type == "unix") {ptype <- "FORK"}
cl <- makeCluster(no_cores, type = ptype)
clusterMap(cl, myfun, x = L2, y = L1)
stopCluster(cl) …Run Code Online (Sandbox Code Playgroud) 在LINQ查询中,我可以正确地(如:编译器不会抱怨)调用.AsParallel(),如下所示:
(from l in list.AsParallel() where <some_clause> select l).ToList();
Run Code Online (Sandbox Code Playgroud)
或者像这样:
(from l in list where <some_clause> select l).AsParallel().ToList();
Run Code Online (Sandbox Code Playgroud)
究竟有什么区别?
从官方文档来看,我几乎总是看到第一种方法,所以我认为这是要走的路.
今天,我试图自己运行一些基准测试,结果令人惊讶.这是我运行的代码:
var list = new List<int>();
var rand = new Random();
for (int i = 0; i < 100000; i++)
list.Add(rand.Next());
var treshold= 1497234;
var sw = new Stopwatch();
sw.Restart();
var result = (from l in list.AsParallel() where l > treshold select l).ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() before: {sw.ElapsedMilliseconds}");
sw.Restart();
result = (from l in list where …Run Code Online (Sandbox Code Playgroud) 我有一个AWS实例.我想运行一堆任务,一些内存和CPU密集.理想情况下,我想计算每项任务的时间信息.如果我连续运行它们,它会计算准确的计时信息,但速度很慢.如果我并行运行它们,整个事情就会更快,但是单个任务的速度会更慢,正如壁时间和线程CPU时间所报告的那样.
随着线程数量增加到CPU数量,这种减速会增加
粗略检查ghc-events-analyze并+RTS -s暗示减速的来源(不出所料)GC暂停.使用RTS选项显示+RTS -qg -qb -qa -A256m(禁用并行GC,禁用负载平衡GC,禁用线程迁移以及增加GC分配区域)可以改善这一点,但并不能完全消除它.
我正在使用线程运行forkIO,但除了打印进度信息之外,线程是独立且纯粹的.我正在使用parallel-io来管理正在运行的线程的数量,但是当我简单地尝试一种更常规的方法来获得一个固定的线程池和一个任务队列时,我仍然遇到了这个问题.
有关如何调试的任何建议?
编辑:
@jberryman问了一个例子.每个任务看起来像下面的代码
computation params = do
!x <- force params
print $ "Starting computation on " ++ show params
t1 <- getCPUTime
!y <- fmap force $ do $
...some work with x ...
t2 <- getCPUTime
print $ "Finished computation on " ++ show params
return (t2 - t1, y)
Run Code Online (Sandbox Code Playgroud) parallel-processing multithreading garbage-collection haskell
据我所知,C++ 17将带有Parallelism.但是,我无法理解的是它是一种特定的硬件并行性(默认为CPU)?或者它可以扩展到具有多个计算单元的任何硬件?
换句话说,我们会看到类似于"nVidia C++标准编译器"的东西,它将编译要在GPU上执行的并行部分吗?
例如,它是OpenCL的一些标准替代品吗?
注意:当然,我不是在问"nVidia会这么做吗?".我在问C++ 17标准是否允许,以及理论上是否可行.
我的数据框"A"看起来像这样:
type latw lngs late lngn
0 1000 45.457966 9.174864 45.458030 9.174907
1 1000 45.457966 9.174864 45.458030 9.174907
2 1000 45.458030 9.174864 45.458094 9.174907
3 1000 45.458094 9.174864 45.458157 9.174907
4 1000 45.458157 9.174864 45.458221 9.174907
5 1000 45.458221 9.174864 45.458285 9.174907
6 1000 45.458285 9.174864 45.458349 9.174907
7 1000 45.458349 9.174864 45.458413 9.174907
8 1000 45.458413 9.174864 45.458477 9.174907
9 1000 45.458477 9.174864 45.458540 9.174907
10 1000 45.458540 9.174864 45.458604 9.174907
11 1000 45.458604 9.174864 45.458668 9.174907
12 1000 …Run Code Online (Sandbox Code Playgroud)