希望这个问题不是太多的开放式…。简单地说:我正在寻找一种脚本或编程语言,可以快速但容易地访问数据库(PostgreSQL)。
我希望使用PostgreSQL数据库中某些表的查询结果作为R分析的输入。查询是简单的SELECT请求(请求中可能有改进的空间,但目前我并不是这样看的--不久前我已经这样做了),但是在第一个查询结果的循环中。表包括数字和字符串,如果不是几十万行,则是数千行,因此查询的总数可能相当大。
显然,我首先使用R编写了一个RPostgreSQL脚本。然而,它需要太多的时间才能舒适地使用(我希望能够随时修改和重新运行它)。我已经非常有效地优化了这个脚本,“system.time”告诉我,大部分时间都花在循环中的DB查询上。
然后,当我发现如果我使用一个文本文件作为R的输入会快得多,我决定使用psycopg2将这个R脚本转换成python。不幸的是,python脚本并不比R脚本快多少。
最后,我开始使用C++编写一个libpq-fe程序,但我发现它不够灵活(我的意思是,为了处理查询,我必须将代码的行数乘以至少3或4行)。
因此,我想知道是哪种语言(或者其他R或python库)?将提供速度和灵活性之间的最佳折衷(就查询结果而言:列表、数组、字符串操作…)对于DB访问(即PostgreSQL)。也就是说,它需要比R+RPostgreSQL和python+psycopg2快得多,而且几乎和“灵活”一样。
谢谢你的建议(语言必须是linux友好的)。
Update:以下是仅使用前500个检索元素的新旧代码的典型计时,并按照Ryan和suggested的建议纠正了N+1问题的代码:
> system.time(source("oldcode.R"));
user system elapsed
3.825 0.052 49.363
> system.time(source("newcode.R"));
user system elapsed
1.920 0.140 3.551 对于第一次检索的1000个元素相同:
> system.time(source("oldcode.R"));
user system elapsed
9.816 0.092 100.340
> system.time(source("newcode.R"));
user system elapsed
5.040 0.072 6.695 可能真的值得一改。;-)
发布于 2012-08-07 22:33:24
若要使数据库的任何接口快速运行,请优化数据库查询。正如您所发现的,即使使用R优化的代码,大部分时间都是在数据库上度过的。因此,您应该选择您最熟悉和最熟悉的编程语言;因为这将是最快的编程语言,就前端而言。
然而,无论您使用哪种编程语言,总体结果(就感知性能而言)都是相同的。没有任何库可以提高查询的速度,因为这完全是数据库的一个函数。库/语言允许您将多个查询组合到单个事务中,但是查询的结果仍然取决于数据库布局和优化。
简单的事情,比如缺少列上的索引,可能会产生很大的影响。
首先在查询上运行EXPLAIN ANALYZE,然后将结果粘贴到这个工具中,以可视化数据库正在做的事情,从而知道从哪里开始优化。
https://stackoverflow.com/questions/11854998
复制相似问题