热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

R代码优化:用于循环和写入数据库

我正在尝试优化我在两个方面编写的简单R代码:1)

我正在尝试优化我在两个方面编写的简单R代码:

1) 用于循环

2) 将数据写入我的PostgreSQL数据库

对于 1) 我知道应该不惜一切代价避免for循环,建议使用lapply,但是我不清楚如何在下面使用lapply转换我的代码

对于 2) ,我下面的工作是否有效,但是我不确定这是最有效的方法(例如,将这种方式与将所有数据重新绑定到R中一样)数据框,然后将整个数据框加载到我的PostgreSQL数据库中。)

编辑:我用下面的可复制示例更新了代码。

for (i in 1:100){
search <- paste0("https://github.com/search?o=desc&p=",i,&q=R&type=Repositories)
download.file(search,destfile ='scrape.html',quiet = TRUE)
url <- read_html('scrape.html')
github_title <- url%>%html_nodes(xpath="//div[@class=mt-n1]")%>%html_text()
github_link <- url%>%html_nodes(xpath="//div[@class=mt-n1]//@href")%>%html_text()
df <- data.frame(github_title,github_link )
colnames(df) <- c("title","link")
dbWritetable(con,"my_database",df,append = TRUE,row.names = FALSE)
cat(i)
}

非常感谢您的所有投入!


首先,完全荒谬的是,lapply比使用for loop的等效代码要快得多。多年来,此问题已得到解决,for loops在每种情况下都应比等效的lapply更快。

随着您似乎觉得更直观,我将使用for loop进行可视化。但是请注意,我主要在T-sql中工作,可能需要进行一些转换。

n <- 1e5
outputDat <- vector('list',n)
for (i in 1:10000){
id <- element_a[i]
location <- element_b[i]
language <- element_c[i]
date_creation <- element_d[i]
df <- data.frame(id,location,language,date_creation)
colnames(df) <- c("id","location","language","date_creation")
outputDat[[i]] <- df
}
## Combine data.frames
outputDat <- do.call('rbind',outputDat)
#Write the combined data.frame into the database.
##dbBegin(con) #<= might speed up might not.
dbWriteTable(con,"my_database",df,append = TRUE,row.names = FALSE)
##dbCommit(con) #<= might speed up might not.

使用Transact-SQL,您可以选择将整个字符串组合为单个insert into语句。在这里,我将偏离并使用apply对行进行迭代,因为在这种情况下它更易读。如果正确完成,则for循环再次变得一样快。

#Create the statements. here
statement <- paste0("('",apply(outputDat,1,paste0,collapse = "','"),"')",collapse = ",\n") #\n can be removed,but makes printing nicer.
##Optional: Print a bit of the statement
# cat(substr(statement,2000))
##dbBegin(con) #<= might speed up might not.
dbExecute(con,statement <- paste0(
'
/*
SET NOCOCUNT ON seems to be necessary in the DBI API.
It seems to react to 'n rows affected' messages.
Note only affects this method,not the one using dbWriteTable
*/
--SET NOCOUNT ON
INSERT INTO [my table] values ',statement))
##dbCommit(con) #<= might speed up might not.

请注意,正如我所评论的那样,这可能会导致无法正确上载表,因为DBI包有时会导致这种交易失败,如果它导致有关n rows affected的一条或多条消息。

最后但并非最不重要的一点是,可以将语句从R复制并粘贴到任何直接访问数据库的GUI中,例如使用writeLines(statement,'clipboard')或写入文本文件(如果您的数据包含很多行,则文件更稳定)。在极少数的异常情况下,如果出于某种原因DBI或替代R程序包似乎无故运行太慢,则最后一招可能会更快。由于这似乎是一个个人项目,因此可能足以供您使用。


推荐阅读
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 现在越来越多的人使用IntelliJIDEA,你是否想要一个好看的IDEA主题呢?本篇博客教你如何设置一个美美哒IDEA主题,你也可以根据 ... [详细]
  • 2019-2020学年 20174325 叶竞蔚 《网络对抗技术》实验六:Metasploit基础应用
    本实验旨在掌握Metasploit框架的基本应用方法,重点学习三种常见的攻击方式及其实施思路。实验内容包括一次主动攻击(如MS08-067)、一次针对浏览器的攻击(如MS11-050)以及一次针对客户端的攻击(如Adobe漏洞利用)。此外,还包括成功应用一个辅助模块。 ... [详细]
  • 本文详细探讨了如何在PHP中有效防止SQL注入攻击,特别是在使用MySQL数据库时。文章通过具体示例和专业建议,帮助开发者理解和应用最佳实践。 ... [详细]
  • WPF MVVM: 动态添加控件与数据绑定的最佳实践
    本文介绍如何在WPF应用程序中使用MVVM模式动态添加控件并进行数据绑定。通过示例展示如何创建一个虚拟键盘,其中包含多个按键。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
author-avatar
moTzxx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有