私のハードウェアは非常に限られているため (32 ビットの Win7 と 4 GB の RAM を備えたデュアル コア - 私はそれを最大限に活用する必要があります...)、大きなテキスト ファイル (約 1.2 GB) を DB に保存しようとしました。これを SQL のようなクエリでトリガーして、特定のサブグループに対して何らかの分析を行うことができます。
正直なところ、私はこの分野に詳しくありません。「グーグル」で問題に関するヘルプを見つけることができなかったので、思いついたことと、物事がどのように見えるかを簡単に示します。
まず、txt ファイルに含まれる列の数を確認します。
k <- length(scan("data.txt", nlines=1, sep="\t", what="character"))
次に、テキスト ファイルへの接続を開き、1 行ごとに再度開く必要がないようにします。
filecon<-file("data.txt", open="r")
次に、SQLite データベースへの接続 (dbcon) を初期化します。
dbcon<- dbConnect(dbDriver("SQLite"), dbname="mydb.dbms")
1行目の位置がどこかわかる
pos<-seek(filecon, rw="r")
最初の行には列名が含まれているため、後で使用するために保存します
col_names <- unlist(strsplit(readLines(filecon, n=1), "\t"))
次に、最初の 10 行を 1 行ずつ読み取り、それらを DB に保存することをテストします。DB 自体に k - column-names = col_names の列が含まれている必要があります。
for(i in 1:10) {
# prints the iteration number in hundreds
if(i %% 100 == 0) {
print(i)
}
# read one line into a variable tt
tt<-readLines(filecon, n=1)
# parse tt into a variable tt2, since tt is a string
tt2<-unlist(strsplit(tt, "\t"))
# Every line, read and parsed from the text file, is immediately saved
# in the SQLite database table "results" using the command dbWriteTable()
dbWriteTable(conn=dbcon, name="results", value=as.data.frame(t(tt2[1:k]),stringsAsFactors=T), col.names=col_names, append=T)
pos<-c(pos, seek(filecon, rw="r"))
}
これを実行すると、次のエラーが表示されます
Warning messages:
1: In value[[3L]](cond) :
RS-DBI driver: (error in statement: table results has 738 columns but 13 values were supplied)
なぜ 738 列を用意する必要があるのですか? k (12) を 738 に変更すると、コードは機能しますが、指定する予定の列名ではなく、V1、V2、V3、... によって列をトリガーする必要があります。
res <- dbGetQuery(dbcon, "select V1, V2, V3, V4, V5, V6 from results")
どんな助けや小さなヒントでも大歓迎です!