我有一些繁重的 csv 表,我想与 @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
and 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
请注意,要使此代码使用多线程,您需要设置JULIA_NUM_THREADS
运行 Julia 之前的系统变量,例如:
set JULIA_NUM_THREADS=2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)