我正在从一张表中读取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)
答案 0 :(得分:0)
你可以做的是在db表中添加一个索引,这样你就可以循环遍历它并逐个提取/写入你的数据,而不会填满你的记忆 这是一个例子
# 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)