6

読んでみると、メモリを超える csv ファイルを読み取る最良の方法はread.csv.sqlfrom packageを使用することであることがわかりましたsqldf。この関数は、データを sqlite データベースに直接読み込み、結果として sql ステートメントを実行します。

次のことに気付きました: sqlite に読み込まれたデータは一時テーブルに格納されているようです。そのため、将来の使用のためにアクセスできるようにするには、sql ステートメントでそのように要求する必要があります。

例として、次のコードはいくつかのサンプル データを sqlite に読み込みます。

# generate sample data
sample_data <- data.frame(col1 = sample(letters, 100000, TRUE), col2 = rnorm(100000))
# save as csv
write.csv(sample_data, "sample_data.csv", row.names = FALSE)
# create a sample sqlite database
library(sqldf)
sqldf("attach sample_db as new") 
# read the csv into the database and create a table with its content
read.csv.sql("sample_data.csv", sql = "create table data as select * from file", 
             dbname = "sample_db", header = T, row.names = F, sep = ",")

でデータにアクセスできますsqldf("select * from data limit 5", dbname = "sample_db")

問題は次のとおりです: sqlite ファイルは本来の 2 倍のスペースを占有します。私の推測では、データが 2 回含まれていると思います。1 回は一時的な読み取り用で、もう 1 回は格納されたテーブル用です。でデータベースをクリーンアップできますsqldf("vacuum", dbname = "sample_db")。これにより空きスペースが再利用されますが、特にファイルが大きい場合は時間がかかります。

初めてこのデータの重複を作成しない、これに対するより良い解決策はありますか?

4

1 に答える 1

9

RSQLite解決策:経由せずに使用sqldf

library(RSQLite)
con <- dbConnect("SQLite", dbname = "sample_db")
# read csv file into sql database
dbWriteTable(con, name="sample_data", value="sample_data.csv", 
             row.names=FALSE, header=TRUE, sep = ",")
于 2012-09-12T16:00:44.293 に答える