Julia : 再谈HDF5 的save 和 load

我去年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)的方式会更好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值