2017-06-19 13 views
-1

テーブルから300万レコードを読み込んでいますが、テキストファイルに書き込みたいのですが、プログラムのメモリが不足していますエラーを投げるRODBCから300万レコードを読み込んでテキストファイルに書き込む方法

メモリの最大容量を超える3096 MB。

マイシステム構成は、4GB 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行は、データベースの* small data *です。どのデータベースを使用していますか?そして、なぜ*最初にデータをエクスポートしようとしていますか? –

+1

新しいバージョンのdplyrを使用せずに、データベースが不足しているときに必要な作業をしてみませんか?それからあなたが分析したい何か(おそらくもっと小さいもの)があるとき、それをRに持ってきてください。 – RobertMc

+0

ODBC接続を使用してSQL Serverに接続しようとしています。私はちょうどデータベースからデータを取得し、私の必要性に必要な変換をしたい。私は小さなテーブルでこれを行うことができましたが、この特定の300万レコードのテーブルでは、メモリが不足していて、それをどう扱うかわからない –

答えて

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

こんにちはムーア、私はテーブルへの読み取り専用アクセスを持っているので、いくつかのデータのために、列を追加することはできません会社のセキュリティポリシー私は私は問題に直面しています。 –

+0

インデックスとして合理的に使用できる列はありますか?私は 'rownum'がOracleのクエリによって生成されることを知っているので、うまくいきません。 –

関連する問題