14

我买了 Kibot 的股票数据,它是巨大的。我有大约 125,000,000 行要加载(1000 只股票 * 125k 行/股票 [自 2010 年 1 月 1 日以来的 1 分钟柱形数据],CSV 文件中的每只股票,其字段为日期、时间、开盘、高、低、收盘,体积)。我对 python 完全陌生(我选择它是因为它是免费的并且受到社区的良好支持),我选择 SQLite 来存储数据是因为 python 对它的内置支持。(而且我非常了解 SQL 语言。SQLiteStudio 是一个免费程序的瑰宝。)

我的加载程序运行良好,但速度越来越慢。SQLite db 大约 6 Gb,并且只加载了一半。我使用 INSERT 语句加载大约 500k 行/小时,并在每只股票(大约 125k 行)之后提交事务。

那么问题来了:PyTables 是否比 SQLite 快得多,努力学习如何使用它值得吗?(而且由于我处于学习模式,请随意提出这两个的替代方案。)PyTables 困扰我的一件事是它真的很简单,几乎就像保存一个二进制文件一样,用于免费版本。没有“where 子句”函数或索引,因此您最终会扫描所需的行。

加载数据后,我将使用基于 NumPy 的东西进行统计分析(滚动回归和相关等):Timeseries、larry、pandas 或 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
);
4

2 回答 2

10
  1. 早在 2003 年,PyTables 的作者 F. Altec 就写了一篇关于 PyTables 和 Sqlite 比较的科学论文。这表明 PyTables 通常更快,但并非总是如此。

  2. 关于你认为 PyTables 感觉“简单”的观点,我想说 H5py 是在 python 中访问 HDF5 的简单方法,PyTables 带来了各种额外的东西,比如查询和索引,而 HDF5 本身没有这些东西。

查询示例:

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

请注意,具有更高级选项的 PyTables PRO 刚刚不复存在,Pro 版本将从现在开始免费。这意味着还有额外的选择。

于 2011-06-20T13:28:44.647 回答
4

建议:

  1. 您有 1 GB 的内存没有被使用。尝试使用 cache_size pragma -此处的文档。其他感兴趣的语用:synchronous并且page_size......对于后者来说可能为时已晚。

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

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

于 2011-05-25T08:29:20.293 回答