在 Julia 中与 @sync @async 并行
Parallelism with @sync @async in Julia
我有一些很重的 csv table,我想将其与 @sync @sync 宏并行导入。
对这个不是很熟悉,我试过这样:
#import files
@sync @async begin
df1=CSV.File(libname*"df1.csv")|> DataFrame!
df2=CSV.File(libname*"df2.csv")|> DataFrame!
end
我已经完成了任务,但是我之后制作的数据子集似乎受到了影响:
select!(df1, Not("Var1"))
ArgumentError : Column :Var1 not found in the data frame
PS :没有 @sync 宏代码运行良好
我可能做错了什么。任何想法都会有所帮助。
谢谢
@sync @async
除了引入一个 begin
...end
块及其本地作用域外,不要在代码中做任何事情。
这里发生的是您正在创建一个新范围并且从不修改 df1
和 df2
的全局值 - 而不是您看到的是它们的旧值。
如果 I/O 是您代码中的瓶颈,正确的代码如下:
dfs = Vector{DataFrame}(undef, 2)
@sync begin
@async dfs[1]=CSV.File(libname*"df1.csv")|> DataFrame!
@async dfs[2]=CSV.File(libname*"df2.csv")|> DataFrame!
end
但是,问题通常不是 I/O,而是 CPU。在这种情况下,绿色线程并没有多大用处,您需要普通的常规线程:
dfs = Vector{DataFrame}(undef, 2)
Threads.@threads for i in 1:2
dfs[i]=CSV.File(libname*"df$i.csv")|> DataFrame!
end
请注意,要使此代码使用 multi-threading,您需要在 运行 Julia 之前设置 JULIA_NUM_THREADS
系统变量,例如:
set JULIA_NUM_THREADS=2
我有一些很重的 csv table,我想将其与 @sync @sync 宏并行导入。 对这个不是很熟悉,我试过这样:
#import files
@sync @async begin
df1=CSV.File(libname*"df1.csv")|> DataFrame!
df2=CSV.File(libname*"df2.csv")|> DataFrame!
end
我已经完成了任务,但是我之后制作的数据子集似乎受到了影响:
select!(df1, Not("Var1"))
ArgumentError : Column :Var1 not found in the data frame
PS :没有 @sync 宏代码运行良好
我可能做错了什么。任何想法都会有所帮助。 谢谢
@sync @async
除了引入一个 begin
...end
块及其本地作用域外,不要在代码中做任何事情。
这里发生的是您正在创建一个新范围并且从不修改 df1
和 df2
的全局值 - 而不是您看到的是它们的旧值。
如果 I/O 是您代码中的瓶颈,正确的代码如下:
dfs = Vector{DataFrame}(undef, 2)
@sync begin
@async dfs[1]=CSV.File(libname*"df1.csv")|> DataFrame!
@async dfs[2]=CSV.File(libname*"df2.csv")|> DataFrame!
end
但是,问题通常不是 I/O,而是 CPU。在这种情况下,绿色线程并没有多大用处,您需要普通的常规线程:
dfs = Vector{DataFrame}(undef, 2)
Threads.@threads for i in 1:2
dfs[i]=CSV.File(libname*"df$i.csv")|> DataFrame!
end
请注意,要使此代码使用 multi-threading,您需要在 运行 Julia 之前设置 JULIA_NUM_THREADS
系统变量,例如:
set JULIA_NUM_THREADS=2