程序(时间)瓶颈是数据库交互

时间:2017-05-24 09:30:30

标签: python postgresql pandas profiling

最近我一直在运行一些(似乎)数据密集型的数据分析程序。我有一个相当大的~600万行,20列数据集。该程序主要使用pandasnumpy。对数据也进行了许多操作。

在使用分析器改进代码之后,我已经做了一些事情。我在DataDate列的数据库表上创建了一个索引,这大大提高了速度,但到目前为止,代码中的瓶颈仍然是pandas read_sql函数。

我的程序通常只想访问整个数据集中的小块,例如15行。在我看来,在检索的数据大小和程序检索信息的次数之间存在权衡。对于下面的图片,您可以看到read_sql函数占用了761,整个程序大约需要790才能完成。 enter image description here

程序只有1个子程序和1行调用read_sql:

this_trade = pandas.read_sql("""select * from options where "OptionRoot" = '%s' and "DataDate" between '%s' and '%s' order by "DataDate" asc limit 21;""" % (row['OptionRoot'],row['DataDate'],row['Expiration']), engine)

我尝试将整个options表一次加载到pandas数据框中,然后从子例程中的数据框中访问数据:

this_trade = options[ ( options['OptionRoot'] == row['OptionRoot'] ) & (options['DataDate'].between(row['DataDate'],row['Expiration']) ) ]

这种情况进展缓慢,我甚至不想等待探查器输出。

所以问题是:我可以以某种方式加速我的数据读取吗?

1 个答案:

答案 0 :(得分:1)

您还可以在该索引中包含OptionRoot,具体取决于它包含多少个不同的值。如果它只是少数(如布尔值)那么最好不要索引这样的列。

第二个选项(不是排他性)是DataDateOptionRoot partition此表格。如果您的日期范围(或OptionRoot)仅涵盖您的数据的一小部分,这应该会给您带来非常大的速度提升,因为确定需要访问的分区非常快,然后您需要使用较小的集合,例如例如1m行而不是20m。