如何从 RODBC 读取 300 万条记录并写入文本文件
Posted
技术标签:
【中文标题】如何从 RODBC 读取 300 万条记录并写入文本文件【英文标题】:How to Read 3 Million Records from RODBC and write to Text File 【发布时间】:2017-06-19 16:30:35 【问题描述】:我正在从一个表中读取 300 万条记录,我想将其写入一个文本文件,但我正面临程序内存不足引发错误
超过内存的最大空间 3096 MB。
我的系统配置是带有 4 GB RAM 的 i5 处理器。
请在下面找到代码。
library(RODBC)
con <- odbcConnect("REGION", uid="", pwd="")
a <- sqlQuery(con, "SELECT * FROM dbo.GERMANY where CHARGE_START_DATE = '04/01/2017'");
write.table(a,"C:/Users/609354986/Desktop/R/Data/1Germany.txt",na="",sep="|",row.names = FALSE,col.names = FALSE)
close(con)
【问题讨论】:
不要? R 不是 ETL 工具。您的数据库已经为此提供了一些非常好的工具。 3M 行是数据库的小数据。您正在使用哪个数据库以及为什么您首先要尝试导出数据? 为什么不使用新版本的 dplyr 并在数据库内存不足的情况下做您需要的事情?然后当你有想要分析的东西(可能更小)时将它带入 R。 我正在尝试使用 ODBC 连接连接到 SQL Server。我只想从数据库中检索数据并根据我的需要进行必要的转换。我能够为较小的表执行此操作,但是对于这个包含 300 万条记录的特定表,我的内存不足,不知道如何处理它 R 不是解决此问题的正确工具。与“本机”数据库解决方案相比,它会非常慢。您甚至可以使用普通的 SQL 客户端并重定向到文件... 【参考方案1】:您可以做的是为您的数据库表添加一个索引,这样您就可以遍历它并逐个提取/写入数据而不会填满您的内存 这是一个例子
# create that index
sqlQuery(channel, 'alter table dbo.GERMANY ADD MY_COL NUMBER')
sqlQuery(channel, 'update dbo.GERMANY set MY_COL = rownum ')
# the function
g <- function(a)
for (i in (1:length(a)))
query <- gsub('\n',' ', paste( "SELECT * FROM dbo.GERMANY where
CHARGE_START_DATE = '04/01/2017 and
my_col between",a[i] ," and ", a[i+1], collapse = ' '));
df <- sqlQuery(channel, query) ;
write.csv(df, paste('my_',i,'_df.csv')) ;
# use reasonable chunks
a <- seq(1,3000000,250000)
g(a)
【讨论】:
嗨 Mouad,我对表具有只读访问权限,因此无法添加列,由于公司中的某些数据安全策略,我必须仅使用 ODBC 连接访问数据,这就是我我正面临着问题。 有没有可以合理用作索引的列?我知道rownum
是由 Oracle 中的查询生成的,所以这不起作用,但任何排序的列都可以。以上是关于如何从 RODBC 读取 300 万条记录并写入文本文件的主要内容,如果未能解决你的问题,请参考以下文章
一个数据表如果同时写入同时读取 会影响表的查询速度吗,如何优化大数据量表,比如1000万条用户记录
服务器上有个2万条记录的MySQL数据表,读取并写入本地数据库,怎么这么慢啊?