読んでみると、メモリを超える csv ファイルを読み取る最良の方法はread.csv.sql
from 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")
。これにより空きスペースが再利用されますが、特にファイルが大きい場合は時間がかかります。
初めてこのデータの重複を作成しない、これに対するより良い解決策はありますか?