Dataframe 与Julia中的@sync@async并行

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

我有一些繁重的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
除了引入
开始
之外,不要在代码中执行任何操作<代码>结束块及其局部范围

这里发生的情况是,您正在创建一个新范围,并且从不修改
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

谢谢,对我很有用。