R 将所有MYSQL表加载到具有相同名称的数据帧中

R 将所有MYSQL表加载到具有相同名称的数据帧中,r,rmysql,R,Rmysql,我已经使用以下代码成功地将所有MySQL表加载到尽可能多的dataframe变量中,所有这些变量的名称都与表名相同(这是个人学习)。我的问题是:有没有更好的方法,因为我感觉这相当慢 db<-dbConnect(MySQL(),user='****',password="****",dbname="****",host='XX.XXX.XXX.XX') tables<-dbListTables(db) #load all tables in variables with

我已经使用以下代码成功地将所有MySQL表加载到尽可能多的dataframe变量中,所有这些变量的名称都与表名相同(这是个人学习)。我的问题是:有没有更好的方法,因为我感觉这相当慢

db<-dbConnect(MySQL(),user='****',password="****",dbname="****",host='XX.XXX.XXX.XX') 

  tables<-dbListTables(db)

  #load all tables in variables with same name as the MySQL table name. 
  #warning : this loop will take more than 90 seconds to complete and will download all the MySQL tables.
  for (i in 1:NROW(tables)){
    assign(tables[i],dbReadTable(db,tables[i]))
  }

#release the DB
  dbDisconnect(db)

如图所示,考虑将所有MySQL表保存为<强> > <强>列表中的许多数据框,避免了在全局环境中管理许多对象。下面偶数将列表元素命名为相应的表名,可使用
$
[[…]]]
索引进行引用:

# DATA FRAME LIST OF NAMED ELEMENTS
dfList <- setNames(lapply(tables, function(t) dbReadTable(db, t)), tables)

dfList$table1Name    
dfList[["table2Name"]]    
...
现在,如果您确实需要多个变量,请使用
list2env
将列表元素输出到单独的对象:

list2env(dfList, envir=.GlobalEnv)

如图所示,考虑将所有MySQL表保存为<强> > <强>列表中的许多数据框,避免了在全局环境中管理许多对象。下面偶数将列表元素命名为相应的表名,可使用

$
[[…]]]
索引进行引用:

# DATA FRAME LIST OF NAMED ELEMENTS
dfList <- setNames(lapply(tables, function(t) dbReadTable(db, t)), tables)

dfList$table1Name    
dfList[["table2Name"]]    
...
现在,如果您确实需要多个变量,请使用
list2env
将列表元素输出到单独的对象:

list2env(dfList, envir=.GlobalEnv)

这里速度方面的限制因素不是R代码,而是您与db的连接和表的大小。但是,更好的方法是将所有数据帧放在一个命名列表中(在表名上使用
lappy
),如果您只是在学习R,请忘记您听说过的
assign
;不要使用它。
dfList@Parfait:这将把表存储在一个数组(list)中。但是我需要它们的变量名与数据库中的表相同。@joran:如果我不使用assign,那么在名称嵌入到数组表中的变量中存储内容的替代方法是什么?命名列表在功能上与您描述的相同,实际上更好。在全局名称空间中有许多单独的变量,这使得它们都很难使用。这里速度方面的限制因素不是R代码,而是您与数据库的连接和表的大小。但是,更好的方法是将所有数据帧放在一个命名列表中(在表名上使用
lappy
),如果您只是在学习R,请忘记您听说过的
assign
;不要使用它。
dfList@Parfait:这将把表存储在一个数组(list)中。但是我需要它们的变量名与数据库中的表相同。@joran:如果我不使用assign,那么在名称嵌入到数组表中的变量中存储内容的替代方法是什么?命名列表在功能上与您描述的相同,实际上更好。全局名称空间中有很多单独的变量,这使得它们都很难使用。+1对于命名列表创建思想@Parfait,但我有一个小问题:在列表样式中,mem的利用率(通过对象大小衡量)几乎是原来的两倍。我只量了一张桌子
object.size(dfList$table1)
object.size(table1)
的两倍,其中table1是一个转换后的数据帧,包含来自源数据dfList$table1的一个额外列。因此,尽管增加了一个额外的变量,我们还是减少了50%。为什么?我做了一些调查,发现当转换为POSIXlt表单date时,缩小大小的不是列表而是日期字符字符串。这是有道理的。那么,这回答了你的问题吗?此外,您正在尝试将所有MySQL数据库(存储在服务器硬盘上)存储在R内存环境中。考虑如果资源有限,一次一个地在桌子上工作。是的,这个问题回答得很好。是的,我同意内存需求会随着数据库的增加而增加,然后一次一个表会更好。现在我总共有不到60 MB(object_大小)用于所有60个表。所以这是可以管理的。+1对于命名的列表创建idea@Parfait,但我有一个小问题:在列表样式中,mem的利用率(通过对象大小衡量)几乎是两倍。我只量了一张桌子
object.size(dfList$table1)
object.size(table1)
的两倍,其中table1是一个转换后的数据帧,包含来自源数据dfList$table1的一个额外列。因此,尽管增加了一个额外的变量,我们还是减少了50%。为什么?我做了一些调查,发现当转换为POSIXlt表单date时,缩小大小的不是列表而是日期字符字符串。这是有道理的。那么,这回答了你的问题吗?此外,您正在尝试将所有MySQL数据库(存储在服务器硬盘上)存储在R内存环境中。考虑如果资源有限,一次一个地在桌子上工作。是的,这个问题回答得很好。是的,我同意内存需求会随着数据库的增加而增加,然后一次一个表会更好。现在我总共有不到60 MB(object_大小)用于所有60个表。所以这是可以管理的。