我去年6月份左右测试了在0.2或0.3版本中,Julia中save 和load的效率,并和MATLAB进行了相关的比较。
一、自定义类型的测试
以历史行情数据为例,我测试2700万条BAR数据,这个大约相当于800只股票1分钟线近半年的历史数据的规模。具体类型见下。
1、测试数据类型
type kBarData
Code ::ASCIIString
DateTime ::Dates.DateTime
Close ::Float64
Open ::Float64
High ::Float64
Low ::Float64
PreClose ::Float64
OpenInterest ::Float64 # 商品,通过这个来判断迁月
Volume ::Float64
Amount ::Float64 # 股指
end
上面是我们自定义的复合类型,是我们经常用到的格式。这个在实际环境中更有测试的意义。
2、测试代码
using HDF5,JLD;
t0 =time()
testNum =100000;
dayBarNum = 270;
println("测试数据, 测试共 $(testNum) 天, 每天 有 $(dayBarNum) 个BAR记录! ")
@time tdata =setdata(testNum,dayBarNum);
t1 =time();
println("set data : $(t1-t0) s")
println("下面开始存数据,分别做三次......")
@time savedata(tdata);
println("下面开始取数据,分别做三次......")
@time @load string("E:\\typedata_",1,".jld") # 由于@load 无法识别环境变量,就没有写函数封装。
@time @load string("E:\\typedata_",2,".jld")
@time @load string("E:\\typedata_",3,".jld")
function setdata(testNum,dayBarNum)
tdata =Dict{ASCIIString,Array{kBarData,1}}();
code ="600036SH"
for i =1: testNum
nowTime = Dates.now()
td = Array{kBarData,1}();
tempcode = string(code,"_",i)
for j =1: dayBarNum
rd = rand(1,8)*1000.0+100000000.0
bar = kBarData(code,nowTime,rd[1],rd[2],rd[3],rd[4],rd[5],rd[6],rd[7],rd[8]);
push!(td,bar)
end
if haskey(tdata,tempcode)
push!(tdata[tempcode],td)
else
setindex!(tdata,td,tempcode)
end
end
return tdata;
end
function savedata(tdata)
for i=1:3
println("第 $(i) 次存数据.....")
@time @save string("E:\\typedata_",i,".jld") tdata;
end
end
3、测试结果输出
从结果上看,HDF5库的效率仍不理想,仍不适合做为取数据的一种安排。仍需努力呀!
二、@save @load => save load
在取数据时,建议使用load(filename,var)的精准方式。
function getdata()
for i=1:3
println("第 $(i) 次取数据.....")
filename =string("E:\\typedata_",i,".jld");
@time temp = load( filename,"tdata");
end
end
同样,建议@save , 改用成save(filename,var)的方式会更好一些。