由于对SQLite数据比较感兴趣,所以想了解一下。SQLite工具用的是SQLite expert,感觉还不错。接下来的问题是,如何写SQLite数据库的操作脚本了。由于我用的是Julia,还好,Julia有一个SQLite库(https://github.com/quinnj/SQLite.jl)。 (一)Julia的SQLite库的安装Julia其它的库都可以正常安装,但是初次安装SQLite,就是安装不了,很可能是因为deps中有一个SQLite_lib.dll,和其它的库不一样,老是报错。后来,只能求助Github中的SQLite.jl社区,还好,有高手相助,问题终于解决了。感谢呀! 有相关的问题的,有一定的参考意义。 具体见:https://github.com/quinnj/SQLite.jl/issues/55 (二)新建表 假定,在相应的目录下,已经有数据库文件sqliteDB.db。 julia>using SQLite; julia>query(db, "CREATE TABLE newTest (DateTime DateTime, Price Float)"); 这样,一个字段为DateTime,格式为DateTime,另一个字段为Price,格式Float的表已经建立了。 (三)Julia的数据查询和读CSV文件的效率相比:有较大提升。当然,数据查询就必须用上query了。 1、用法 julia>using SQLite;julia>db=SQLiteDB("C:\\Users\\Administrator\\Desktop\\sqliteData\\sqliteDB.db") julia>stringSql = "SELECT * FROM IFnew WHERE CLOSE-LOW>0 "; julia>@time qb=query(db,stringSql) 部分数据内容如下: | Row | "DateTime" | "Price" | "Volume" | "Bid" | "BidVolume" | 2、效率 (1)SQLite: query 数据库中的一个50多万行左右的表文件,字段有8个,大约4秒左右。需要说明的是,因为初次使用,表结构并没有进行任何优化,是SQLite直接导入进表的。 另外,读了一下数据表的另外一张表,存了三个月左右的高频TICK数据,共2222516行,字段大约Date,Time,Price,Volume等7个,花时情况: elapsed time: 5.398775057 seconds (659623560 bytes allocated, 19.68% gc time) 这个数据每一次都有一些变化,不过都在5-8秒左右。我读CSV的话,大约60-90秒不等。 (2)和读CSV文件相比: julia>@time csv= readcsv("E:\\IFData\\IFCSVnew\\IF01.csv") # 这个文件是IFnew表的一半内容,近30万行一个文件 elapsed time: 12.540684093 seconds (823640112 bytes allocated, 12.28% gc time) 如果要读二个这样的CSV的话,我估计总要超过20秒左右。因此,SQLite比读CSV在效率上还是有很大的提升。看来二进制文件和文本文件的效率,还是没法比了。特别是文件越大,效率相对提升更加明显,所以,更坚定了用SQLite的信心! (四)Julia 的appendappend的用法,很简单。就上面IFnew Table为例。 (1)一次insert 一笔记录 假定我们要insert 一笔记录在表的最后面,我们可以如下: 用法: julia> table =["2014-9-15 15:19" 3260.0 700 3360.0 800 3620.0 12]; julia> append(db,IFnew,table ) 1x1 ResultSet 这个表明,insert 记录已经成功,你可以到SQLite expert 的Data中查看,在最后一行,增加了新的记录! (2)一次insert N笔记录 对数据库的insert,尽量要单次多笔进行操作,可以提升操作效率。事实上,append中,已经使用了事务,也就是说,单笔和N笔已经等同。所以,尽量一次insert多笔效率会大幅提高。 以一次操作二笔记录为例: julia> table2 =["2014-9-16 15:19" 3260.0 700 3360.0 800 3620.0 12;"2014-9-16 15:19" 3260.0 700 3360.0 800 3620.0 12]; julia> append(db,IFnew,table2 ) 1x1 ResultSet (3) 一次海量数据的append using SQLite; 几次结果显示,时间在9-11秒之间。感觉是insert 比查询的效率要低,但是insert这个效率,还是不错的。因为,我并不太关心insert效率。 (五)Julia的ResultSet 类型 SQLite库还不错,SQLiteDB函数返回的是一个ResultSet类型的文件,基本上有矩阵的相关特性。 比如: qb[1,1] ="SFIF0001" qb[1,2] =734244.3861111 ; qb.values[3][1] =3468.0; ....... 具体地说,ResultSet里面有二个字段,colnames,values. sqliteDB.db中的IFnew表的结构是,字段:Code, DateTime,Close,Volume,Amount,High,Low,OpenInterest。(1) colnames: qb.colnames[1] ="Code" qb.colnames[2] ="DateTime" qb.colnames[3] ="Close" (2)values: qb.values[1][1] ="SFIF0001" # 表明第一个字段的第一个值 qb.values[2][1] =734244.3861111 #表明第二个字段的第一个值,注这是Matlab型的数值型日期 qb.values[3][1] =3468.0 # 表明是Close字段的第一个值 有了这些,就可以开始干活了,对数据库的数据进行封装了。 总结:Julia的SQLite库做得还不错,最重要的是SQLite数据库不仅简单,效率还不错! |