11

サイズが約3Gの、約1500万行の巨大なcsvファイルがあります。

このファイルをRに1つずつ読み込み、特定の条件に適合する行のみを毎回選択します。

たとえば、列の 1 つは製品タイプと呼ばれているため、1 つのタイプの製品を R に読み込み、それを処理して結果を出力するだけで済みます。その後、別のタイプの製品に移動します...

これまでのところ、大きなファイルをデータベースにアップロードする、colbycol で列ごとに読み取る、または ff で行のチャンクを読み取るなど、さまざまな方法について読んできました ...

私の問題を解決できる純粋なRソリューションはありますか?

4

3 に答える 3

20

RSQLiteパッケージを使用できます:

library(RSQLite)
# Create/Connect to a database
con <- dbConnect("SQLite", dbname = "sample_db.sqlite")

# read csv file into sql database
# Warning: this is going to take some time and disk space, 
#   as your complete CSV file is transferred into an SQLite database.
dbWriteTable(con, name="sample_table", value="Your_Big_CSV_File.csv", 
    row.names=FALSE, header=TRUE, sep = ",")

# Query your data as you like
yourData <- dbGetQuery(con, "SELECT * FROM sample_table LIMIT 10")

dbDisconnect(con)

次にデータにアクセスするときはdbWriteTable、SQLite テーブルがディスクに保存されているため、 を省略できます。

注: SQLite ファイルへの CSV データの書き込みは、最初にすべてのデータをメモリにロードするわけではありません。したがって、最終的に使用するメモリは、クエリが返すデータの量に制限されます。

于 2013-09-13T19:45:15.080 に答える
5

これは R のみを使用して行うことができます。

  1. ファイルへの接続を開く
  2. ヘッダーがある場合は、ヘッダー情報を読み込みます
  3. とをread.csv指定してファイルから 1 行を読み取ります。colClassesnrows=1
  4. その行をテストして、条件を満たしているかどうかを確認し、そうであれば成長するデータフレームに追加します
  5. ファイルの残りの部分について手順 4 を繰り返します。
  6. 接続を閉じる

上記は可能ですが、お勧めできません。このタイプのことは、データをデータベースにロードしてから、R 内からデータベースにクエリを実行することでおそらくより適切に実行できます。

于 2013-09-13T19:24:14.153 に答える
0

これを実現するために JDBC を使用することもできます。サンプルの csv ファイルを作成してみましょう。

write.table(x=mtcars, file="mtcars.csv", sep=",", row.names=F, col.names=T) # create example csv file

http://sourceforge.net/projects/csvjdbc/files/latest/downloadのリンクから CSV JDBC ドライバーをダウンロードして保存し、ドライバーをセットアップします。

> library(RJDBC)

> path.to.jdbc.driver <- "jdbc//csvjdbc-1.0-18.jar"
> drv <- JDBC("org.relique.jdbc.csv.CsvDriver", path.to.jdbc.driver)
> conn <- dbConnect(drv, sprintf("jdbc:relique:csv:%s", getwd())) # replace getwd() with location of csv file

mtcars データセットの上位 3 行を見てみましょう。

> head(dbGetQuery(conn, "select * from mtcars"), 3)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1   21   6  160 110  3.9  2.62 16.46  0  1    4    4
2   21   6  160 110  3.9 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85  2.32 18.61  1  1    4    1

次に、列ギアが取る個別の値とそれぞれのカウントを見てみましょう。

> dbGetQuery(conn, "select gear, count(*) from mtcars group by gear")
  GEAR COUNT(*)
1    4       12
2    3       15
3    5        5

where 句を使用してクエリを作成し、データをフィルター処理して、gear の値が 5 の行のみを選択できるようになりました。

> dbGetQuery(conn, "select * from mtcars where gear = '5'")
   mpg cyl  disp  hp drat    wt qsec vs am gear carb
1   26   4 120.3  91 4.43  2.14 16.7  0  1    5    2
2 30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
3 15.8   8   351 264 4.22  3.17 14.5  0  1    5    4
4 19.7   6   145 175 3.62  2.77 15.5  0  1    5    6
5   15   8   301 335 3.54  3.57 14.6  0  1    5    8
于 2014-03-17T18:38:27.540 に答える