PyTables与SQLite3的插入速度对比
我买了Kibot的股票数据,数据量非常庞大。我大约有1亿2500万行数据需要加载(1000只股票,每只股票有12.5万行数据[自2010年1月1日起的1分钟K线数据],每只股票的数据存储在一个CSV文件中,字段包括日期、时间、开盘价、最高价、最低价、收盘价和成交量)。我对Python完全是新手(我选择它是因为它免费且有很好的社区支持),而且我选择SQLite来存储数据,因为Python自带对它的支持。(我对SQL语言非常熟悉,SQLiteStudio是一个非常棒的免费程序。)
我的加载程序运行得不错,但速度越来越慢。SQLite数据库大约6GB,目前只加载了一半。我每小时大约能加载50万行数据,使用INSERT语句,并在每只股票(大约12.5万行)后提交事务。
所以这里有个问题:PyTables比SQLite快很多吗,值得我花时间去学习它吗?(而且因为我现在正处于学习阶段,欢迎推荐这两者以外的其他选择。)我对PyTables有点担心的是,它的功能非常简单,免费版几乎就像保存一个二进制文件,没有“where子句”功能或索引,所以你最终需要扫描才能找到所需的行。
在我加载完数据后,我打算使用基于NumPy的工具进行统计分析(滚动回归、相关性等):Timeseries、larry、pandas或scikit。我还没有选择分析包,所以如果你有推荐,并且这个推荐最好与PyTables或pandas(或其他)一起使用,请在你的回答中考虑这一点。
(对于@John)
Python 2.6;
Windows XP SP3 32位;
使用制造的字符串作为INSERT语句;
内存使用稳定在750M的2G物理内存中;
CPU使用率在10%左右,波动5%;
完全受I/O限制(磁盘一直在工作)。
数据库架构:
create table MinuteBarPrices (
SopDate smalldatetime not null,
Ticker char( 5 ) not null,
Open real,
High real,
Low real,
Close real not null,
Volume int,
primary key ( SopDate, Ticker )
);
create unique index MinuteBarPrices_IE1 on MinuteBarPrices (
Ticker,
SopDate
);
2 个回答
在2003年,F. Altec写了一篇关于PyTables和Sqlite比较的科学论文。这篇论文表明,PyTables通常运行得更快,但并不是每次都是这样。
关于你提到的PyTables感觉“简单粗暴”,我想说H5py是用Python访问HDF5的最基础方式,而PyTables则提供了很多额外的功能,比如查询和索引,这些是HDF5本身没有的。
查询的例子:
example_table = h5file.root.spamfolder.hamtable
somendarray = hamtable.readWhere('(gender = "male") & (age>40)')
值得注意的是,PyTables的专业版(PRO)有更高级的选项,现在已经停止存在,专业版将从现在开始免费。这意味着你将有更多的选项可以尝试。
建议:
你有1GB的内存没有被使用。可以试试使用cache_size这个设置,具体可以查看这里的文档。还有其他一些设置也值得关注,比如
synchronous
和page_size
……不过后者可能已经来不及了。有时候直接加载基础表而不使用任何索引会更快,然后再创建索引。
用“制造出来的字符串”作为INSERT语句或者其他SQL语句是不好的做法,这样在速度和安全性上都有问题(可以搜索一下“SQL注入攻击”)。现在就改掉这个习惯吧,使用参数化的SQL语句。