PyTables与SQLite3的插入速度

jdm*_*ino 12 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
);
Run Code Online (Sandbox Code Playgroud)

dir*_*jot 10

  1. 早在2003年,一个科学论文上PyTables和SQLite的比较被写了F.奥特,PyTables的作者.这表明PyTables通常更快,但并不总是如此.

  2. 在你的观点上,PyTables感觉"裸骨",我会说H5py是在python中访问HDF5的简单方式,PyTables带来了各种额外的东西,比如查询和索引,HDF5原本没有.

查询示例:

 example_table = h5file.root.spamfolder.hamtable
 somendarray = hamtable.readWhere('(gender = "male") & (age>40)')
Run Code Online (Sandbox Code Playgroud)

需要注意的是PyTables PRO,它具有更丰富的选择,刚刚不复存在,Pro版将是免费的从现在开始.这意味着还有额外的选择.


Joh*_*hin 4

建议:

  1. 您有 1 GB 内存未使用。尝试使用cache_size pragma -文档在这里。其他感兴趣的实用程序:synchronous并且page_size......对于后者来说可能为时已晚。

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

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