Dataframe 与Julia中的@sync@async并行
我有一些繁重的csv表格,我想与@sync@sync宏并行导入。 对此我不太熟悉,我试着这样做:Dataframe 与Julia中的@sync@async并行,dataframe,asynchronous,synchronization,julia,Dataframe,Asynchronous,Synchronization,Julia,我有一些繁重的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
#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
除了引入开始
之外,不要在代码中执行任何操作<代码>结束块及其局部范围
这里发生的情况是,您正在创建一个新范围,并且从不修改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
请注意,要使此代码使用多线程,您需要在运行JULIA之前设置JULIA\u NUM\u THREADS
系统变量,例如:
set JULIA_NUM_THREADS=2
谢谢,对我很有用。