May 092012
 
This entry is part 6 of 20 in the series Matlab数据库基础班

今天用前一篇博文《Matlab在两个数据库间复制数据》 中讲述的方法,从某个及其巨大的存有金融高频数据的SQL Server数据库中拷贝数据到自己机器上的Postgre SQL 数据库上。由于数据量很大,拷贝很久,这个倒不是问题,问题在于拷贝时间一长,Matlab就会报错:“ java.lang.OutOfMemoryError: Java heap space”,真是令人肝肠寸断啊。

原理比较浅显,因为Matlab的I/O操作基本都通过JVM进行,数据库连接也不例外,JDBC连接显然就是通过JVM通道,而ODBC连接的本质也是JDBC,因为它要通过一个ODBC/JDBC转换器转换为JDBC连接。

与数据库通讯的过程,所有数据都要走JVM的通道,也就意味着要占用Jave Heap Memory。经过测试,在读写巨量的高频交易数据时(一年的数据量保存下来大概180MB), 虽然每次只批量读取4096条, 但是占用的内存非常可观。

最初一直报错,于是我就在preference中把Heap Memory的size调到最大,还超过了Matlab推荐值,达到883MB。然后运行,果然就没有再报错了。但是,一看内存占用,简直是“是可忍孰不可忍”,Matlab进程占用内存在855MB到935MB之间。

于是就想着要优化,先从名声一直不太好的fastinsert()入手,把它改为更快一些的datainsert() ,注:fastinsert比datainsert的区别在于它能更“智能”地处理日期类型的数据。但是结果没有好多少,内存占用只下来几十MB。

再下来一狠心,就暂时把datainsert()这条写数据的命令屏蔽了,结果发现占用内存下降特别多,因此可见主要还是写数据这条命令占用内存大啊。然后,就把每次写的数据条数减少,从4096减少到1024,发现内存没有显著下降。再接下来,我就没有耐性了,不再坚持直接向数据库写数据,而是用Matlab从数据库读数据,保存为csv文件,然后再倒入postgreSQL数据库。

技术上面难度也不是特别大:

第一步: 数据库里面下来的数据是cell矩阵,csvwrite()函数不能直接写cell,只能用fprintf(fid,'%s,%d',data{1},data{2})这种形式的函数写入数据库,一次似乎只能写一条,需要写成循环(其实fprintf支持向量和矩阵,但是其形式模式需要另外研究,这里暂时不管),

第二步,当csv文件写完毕,来到postgreSQL数据库,用一条内部命令就可以将这个csv文件中的数据载入到数据库。命令参考地址点击这里。一个简易的命令例子如下:
COPY tblName("col1","col2") FROM 'd:/data/test.csv' WITH DELIMITER ','

注意,这个不是标准SQL语句,不用;结尾

 

 

No related posts.

Series Navigation<< 110328-Matlab通过JDBC连接SQLite数据库用Matlab在数据库间拷贝数据 >>
Bookmark/FavoritesSina WeiboGoogle+FacebookQQTwitterYahoo BookmarksBaiduDiggEmailGoogle GmailOutlook.comEvernotePrintAIMLinkedInBlogger PostKindle ItOrkutShare

Related Posts:

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>