我买了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
);
答案 0 :(得分:10)
早在2003年,关于PyTables和Sqlite的比较的scientific paper是由PyTables的作者F. Altec编写的。这表明PyTables通常更快,但并非总是如此。
关于PyTables感觉'骨头'的观点,我会说H5py是在python中访问HDF5的简单方法,PyTables带来各种额外的东西,如查询和索引,HDF5没有本地拥有。
查询示例:
example_table = h5file.root.spamfolder.hamtable
somendarray = hamtable.readWhere('(gender = "male") & (age>40)')
请注意,PyTables PRO,即使有更好的选择,也刚刚不复存在,Pro版本将从现在开始免费使用。这意味着还有额外的选择。
答案 1 :(得分:4)
建议:
您有1 GB的内存未被使用。尝试使用cache_size编译指示 - docs here。感兴趣的其他pragma:synchronous
和page_size
......后者可能为时已晚。
有时加载没有任何索引的基表会更快,然后创建索引。
“用作INSERT语句的制造字符串”或任何其他SQL语句都是一个坏主意,无论是速度方面还是安全方面(google(“SQL注入攻击”))。现在摆脱这种习惯。使用参数化的SQL语句。