2

希望这个问题不是太多开放式的……简而言之:我正在寻找一种脚本或编程语言,它可以快速但轻松地访问数据库(PostgreSQL)。

我想使用对数据库中某些表的查询结果PostgreSQL作为某些R分析的输入。查询是简单的SELECT请求(请求中可能有改进的空间,但现在我不是这样看的——我前一段时间已经这样做了),而是在第一个查询结果的循环中。表包括数字和字符串,并且有数千行甚至数十万行,因此查询的总数可能非常大。

显然,我首先R使用RPostgreSQL. 但是,使用起来需要太多时间(我希望能够随时修改和重新运行它)。我已经非常有效地优化了这个脚本,''system.time'' 告诉我大部分时间都花在了循环中的数据库查询上。

然后,当我发现如果我使用文本文件作为 的输入会更快R,我决定将此R脚本翻译成python,使用psycopg2. 不幸的是,python脚本并不比R脚本快多少。

最后我开始使用 编写一个C++程序libpq-fe,但我发现它不够灵活而停止了(我的意思是,我必须将我的代码行数至少乘以 3 或 4 才能处理查询) .

因此,我想知道哪种语言(或者其他语言Rpython库?)将为数据库访问(即)提供速度和灵活性之间的最佳折衷(就查询结果而言:列表、数组、字符串操作…… PostgreSQL)。也就是说,它需要比R+RPostgreSQLpython+快得多psycopg2,并且几乎要“灵活”。

感谢您的建议(语言必须是 linux 友好的)。


更新:这是旧代码与新代码的典型时序,仅使用前 500 个检索到的元素,在N+1按照 Ryan 的建议更正了问题的代码之后:

> 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 

可能确实值得改变。;-)

4

1 回答 1

2

使数据库的任何接口快速运行;优化您的数据库查询。正如您所发现的那样,即使使用优化的代码R,大部分时间都花在了 db. 所以你应该选择你最熟悉和最熟悉的编程语言;因为就前端而言,这将是最快的。

但是,无论您使用哪种编程语言,总体结果(就感知性能而言)都是相同的。没有库可以提高查询速度,因为这纯粹是数据库的功能。所有库/语言将允许您将多个查询组合到一个事务中,但查询的结果仍然取决于您的数据库布局和优化。

简单的事情,例如列上缺少索引可能会产生很大的影响。

首先运行EXPLAIN ANALYZE您的查询,然后将结果粘贴到此工具中以可视化数据库正在执行的操作,以便您知道从哪里开始优化。

于 2012-08-07T22:33:24.867 回答