PyTables与SQLite3的插入速度

时间:2011-05-21 18:41:55

标签: python sqlite pytables

我买了Kibot的股票数据,这是巨大的。我有大约125,000,000行要加载(1000股* 125k行/股票[自2010-01-01以来的1分钟条形数据],每个库存在CSV文件中,其字段为日期,时间,开放,高,低,关闭,体积)。我对python完全不熟悉(我之所以选择它是因为它是免费的并得到了社区的支持)而且我选择了SQLite来存储数据,因为python内置了对它的支持。 (而且我非常了解SQL语言.SQLiteStudio是免费程序的宝石。)

我的加载程序运行良好,但速度越来越慢。 SQLite数据库大约是6 Gb,它只有一半加载。我使用INSERT语句加载大约500k行/小时,并在每个库存(大约125k行)之后提交事务。

所以这就是问题: PyTables比SQLite快得多,努力学习如何使用它值得吗? (而且因为我处于学习模式,所以可以自由地提出这两个方案的替代方案。)让我烦恼的一件事就是PyTables,它实际上是免费版本,几乎就像保存二进制文件一样。没有“where子句”功能或索引,因此您最终扫描所需的行。

在我加载数据之后,我将使用基于NumPy的东西进行统计分析(滚动回归和相关等):时间序列,拉里,熊猫或scikit。我还没有选择分析包,所以如果您有推荐,并且该建议最好与PyTables或pandas(或其他)一起使用,请将其纳入您的回复中。

(@John) Python 2.6;
Windows XP SP3 32位;
用作INSERT语句的制造字符串;
在2G物理内存的750M内存使用情况稳固; 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 个答案:

答案 0 :(得分:10)

  1. 早在2003年,关于PyTables和Sqlite的比较的scientific paper是由PyTables的作者F. Altec编写的。这表明PyTables通常更快,但并非总是如此。

  2. 关于PyTables感觉'骨头'的观点,我会说H5py是在python中访问HDF5的简单方法,PyTables带来各种额外的东西,如查询和索引,HDF5没有本地拥有。

  3. 查询示例:

     example_table = h5file.root.spamfolder.hamtable
     somendarray = hamtable.readWhere('(gender = "male") & (age>40)')
    

    请注意,PyTables PRO,即使有更好的选择,也刚刚不复存在,Pro版本将从现在开始免费使用。这意味着还有额外的选择。

答案 1 :(得分:4)

建议:

  1. 您有1 GB的内存未被使用。尝试使用cache_size编译指示 - docs here。感兴趣的其他pragma:synchronouspage_size ......后者可能为时已晚。

  2. 有时加载没有任何索引的基表会更快,然后创建索引。

  3. “用作INSERT语句的制造字符串”或任何其他SQL语句都是一个坏主意,无论是速度方面还是安全方面(google(“SQL注入攻击”))。现在摆脱这种习惯。使用参数化的SQL语句。