5

この度はお読みいただき、誠にありがとうございました。

私は、csv形式の600万レコードと3000列(ほとんどがカテゴリデータ)の超サイズの30GBファイルを持っています。多項回帰のサブサンプルをブートストラップしたいのですが、マシンに 64 GB の RAM があり、そのスワップ ファイルの 2 倍であっても、プロセスが非常に遅くなり停止します。

R でサブサンプル インデックスを生成し、sed または awk を使用してシステム コマンドに入力することを考えていますが、これを行う方法がわかりません。R コマンドだけを使用してこれを行うクリーンな方法を誰かが知っていれば、本当に感謝しています。

1 つの問題は、サブサンプルの完全な観測を選択する必要があることです。つまり、特定の多項観測のすべての行が必要です。観測から観測までの長さが同じではありません。glmnet を使用してから、多項式の場合の近似値を取得するためにいくつかの凝った変換を使用する予定です。もう1つのポイントは、メモリ制限に合わせてサンプルサイズを選択する方法がわからないことです。

あなたの考えを大いに評価してください。

R.version
platform       x86_64-pc-linux-gnu          
arch           x86_64                       
os             linux-gnu                    
system         x86_64, linux-gnu            
status                                      
major          2                            
minor          15.1                         
year           2012                         
month          06                           
day            22                           
svn rev        59600                        
language       R                            
version.string R version 2.15.1 (2012-06-22)
nickname       Roasted Marshmallows   

依田

4

2 に答える 2

1

themel が指摘したように、R は csv ファイルの読み取りが非常に遅いです。
sqlite を使用している場合、データ マイニングは 1 回だけではなく、複数のセッションにわたって複数の方法で行われるように見えるため、これが実際に最良のアプローチです。

私たちが持っているオプションを見てみましょう

csv を R に読み込む (遅い)

R でこれを行うと、(私のマシンで) C で記述されたツールと比較して 20 倍遅くなります。

これは非常に遅いです

read.csv( file='filename.csv' , head=TRUE , sep=",")

事前にstata dtaファイルに変換してそこからロード

それほど素晴らしいものではありませんが、うまくいくはずです (30 GB のファイルで試したことがないので、確実なことは言えません)。

csv を dta 形式に変換するプログラムを作成する (自分が何をしているのかわかっている場合)

http://www.stata.com/help.cgi?dtaのリソースとhttps://svn.r-project.org/R-packages/trunk/foreign/src/stataread.c のコードを使用して読み取り、と書いてhttp://sourceforge.net/projects/libcs​​v
/ (過去にやったことがありますが、使ったことがないので性能はわかりません)

次に、foreignパッケージ ( http://cran.r-project.org/web/packages/foreign/index.html ) を使用して、単純な

library(foreign)
whatever <- read.dta("file.dta")

あなたのデータをロードします

mysql を直接使って csv データをインポートする (使いにくいですが、SQL を知っていればそれほど悪くはありません)

SQL コンソールから

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE my_table 
IGNORE 1 LINES              <- If csv file contains headers
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n'

または

mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE mytable1" mydatabase

RMySQL次に、MySQL データベースへの R インターフェイスを 使用して、R コンソールから再生しますhttp://cran.r-project.org/web/packages/RMySQL/index.html

install.packages('RMySQL')

次に、のように遊んでください

mydb = dbConnect(MySQL(), user=username, password=userpass, dbname=databasename, host=host)
dbListTables(mydb)
record <- dbSendQuery(mydb, "select * from whatever")
dbClearResult(rs)
dbDisconnect(mydb)

R を使用してすべての sqlite/postgreSQL/MySQL バックエンド SQL を実行し、csv をインポートする (推奨)

パッケージがない場合はhttps://code.google.com/p/sqldf/からダウンロードする
か、svn checkout http://sqldf.googlecode.com/svn/trunk/ sqldf-read-only

R コンソールから、

install.packages("sqldf")
# shows built in data frames
data() 

# load sqldf into workspace
library(sqldf)
MyCsvFile <- file("file.csv")
Mydataframe <- sqldf("select * from MyCsvFile", dbname = "MyDatabase", file.format = list(header = TRUE, row.names = FALSE))

そして出発!

事前に、ライブラリ(sqldf)オプションをお勧めします:-)

于 2012-08-17T19:57:19.700 に答える
0

このようなファイル サイズのデータ​​形式として CSV を使用するのは非常にひどい考えだと思います。それを SQLite (または「実際の」データベース) に変換し、SQL クエリでサブセットを抽出してみませんか ( DBI /RSQLite 2を使用)。

CSVファイルを sqlite に直接インポートできるため、一度だけインポートする必要があり、全体をメモリにロードする必要はありません。

一般に、メモリよりも大きなデータセットを操作する場合は、bigmemoryも参照してください。

于 2012-08-16T14:23:35.887 に答える