2017-06-19 72 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中的查詢生成,這樣就不會工作,但任何形式的排名列可以工作。 –

相關問題