2017-06-19 97 views
-1

我正在阅读表中的3百万条记录,并且我想将它写入文本文件,但由于程序内存不足抛出错误如何从RODBC中读取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) 
+1

*别*? R不是ETL工具。你的数据库已经有一些非常好的工具。对于数据库,3M行是*小数据*。你正在使用哪个数据库?*为什么*你首先想要传递数据? –

+1

为什么不使用dplyr的新版本,并在数据库内存不足的情况下执行所需的操作?然后当你想要分析某些东西时(比较小),将它带入R中。 – RobertMc

+0

我试图使用ODBC连接连接到SQL Server。我只想从数据库中检索数据,并根据需要进行必要的转换。我能够为小表做到这一点,但对于这张特殊的3百万记录表,我内存不足,不知道如何处理它。 –

回答

0

你可以做的是添加一个索引到你的数据库表,所以你可以通过它和提取循环/写一块数据块没有填满你的内存 这里有一个例子

# 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) 
+0

嗨Mouad,我只读到表的访问,因此不能添加一列,由于该公司的一些数据安全策略,我一直在使用访问数据只有ODBC连接,这是我面临的问题。 –

+0

有没有可以合理用作索引的列?我知道'rownum'得到由Oracle中的查询生成,这样就不会工作,但任何形式的排名列可以工作。 –

相关问题