web-dev-qa-db-ja.com

大きなxlsxファイルをRにインポートしますか?

「大きな」xlsxファイル(〜20Mb)からデータをインポートする方法を知っている人がいるかどうか疑問に思っています。 xlsxおよびXLConnectライブラリを使用しようとしました。残念ながら、どちらもrJavaを使用しており、常に同じエラーが発生します。

> library(XLConnect)
> wb <- loadWorkbook("MyBigFile.xlsx")
Error: OutOfMemoryError (Java): Java heap space

または

> library(xlsx)
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
   Java.lang.OutOfMemoryError: Java heap space

また、rJavaをロードする前にJava.parametersを変更しようとしました。

> options( Java.parameters = "-Xmx2500m")
> library(xlsx) # load rJava
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
   Java.lang.OutOfMemoryError: Java heap space

または、rJavaをロードした後(これは少しばかげていると思います):

> library(xlsx) # load rJava
> options( Java.parameters = "-Xmx2500m")
> mydata <- read.xlsx2(file="MyBigFile.xlsx")
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
   Java.lang.OutOfMemoryError: Java heap space

しかし、何も機能しません。誰にもアイデアがありますか?

67
user2722443

誰かが分析のために(まだ別の)Excelファイルを送ってくれたとき、私はこの質問につまずいた。これはそれほど大きくはありませんが、何らかの理由で私は同様のエラーに遭遇しました:

Java.lang.OutOfMemoryError: GC overhead limit exceeded

以前の回答の@Dirk Eddelbuettelのコメントに基づいて、openxlsxパッケージをインストールしました( http://cran.r-project.org/web/packages/openxlsx/ )。その後、実行しました:

library("openxlsx")
mydf <- read.xlsx("BigExcelFile.xlsx", sheet = 1, startRow = 2, colNames = TRUE)

それはまさに私が探していたものでした。使いやすく、邪悪な高速。それは私の新しいBFFです。ヒント@Dirk Eをありがとう!

ところで、私はダークEからこの回答を盗みたくないので、彼が回答を投稿する場合は、私のものではなく受け入れてください!

125
orville jackson
options(Java.parameters = "-Xmx2048m")  ## memory set to 2 GB
library(XLConnect)

Javaコンポーネントがロードされる前に、「オプション」を使用してより多くのメモリを許可します。次に、XLConnectライブラリーをロードします(Javaを使用します)。

それでおしまい。 readWorksheet ....などでデータの読み取りを開始します。 :)

13
viquanto

@orville jacksonの回答には同意しますが、それも本当に助けになりました。

@orville jacksonが提供する回答のインライン。ここでは、大きなファイルの読み取りと書き込みにopenxlsxを使用する方法について詳しく説明します。

データサイズが小さい場合、Rには多くのパッケージと機能があり、要件に応じて利用できます。

write.xlsx、write.xlsx2、XLconnectも作業を行いますが、これらはopenxlsxに比べて遅い場合があります。

そのため、大きなデータセットを処理していて、Javaエラーが発生した場合。 「openxlsx」の外観をお勧めします。これは本当にすばらしく、時間を1/12に短縮します。

私はすべてをテストしましたが、ついにopenxlsx機能のパフォーマンスに本当に感銘を受けました。

複数のデータセットを複数のシートに書き込む手順は次のとおりです。

install.packages("openxlsx")
library("openxlsx")

start.time <- Sys.time()

# Creating large data frame
x <- as.data.frame(matrix(1:4000000,200000,20))
y <- as.data.frame(matrix(1:4000000,200000,20))
z <- as.data.frame(matrix(1:4000000,200000,20))

# Creating a workbook
wb <- createWorkbook("Example.xlsx")
Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/Zip.exe") ## path to Zip.exe

Sys.setenv( "R_ZIPCMD" = "C:/Rtools/bin/Zip.exe")は、Rtoolsからユーティリティを参照するため、静的である必要があります。

注:Rtoolsがシステムにインストールされていない場合、スムーズな操作のために最初にインストールしてください。参照用のリンクは次のとおりです:(適切なバージョンを選択) https://cran.r-project.org/bin/windows/Rtools/

以下のリンクに従ってオプションを確認してください(インストール中にすべてのチェックボックスを選択する必要があります) https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png

# Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name

addWorksheet(wb, "Sheet 1")
addWorksheet(wb, "Sheet 2")
addWorksheet(wb, "Sheet 3")

# Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name

writeData(wb, 1, x)

# incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
writeData(wb, 2, x = y, withFilter = TRUE)

## Similarly writeDataTable is another way for representing your data with table formatting:

writeDataTable(wb, 3, z)

saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)

end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

openxlsxパッケージは、Excelファイルとの間で膨大なデータを読み書きするのに非常に優れており、Excel内のカスタム書式設定のための多くのオプションがあります。

興味深い事実は、ここでJavaヒープメモリについて気にする必要がないことです。

7
ayush varshney

標準のExcel-> Rの質問 で述べたように、最近登場した代替手段はreadxlパッケージであり、これは I've found が非常に高速ですと比較して、例えばopenxlsxおよびxlsx

とはいえ、スプレッドシートのサイズには明確な制限がありますが、おそらくそれを.csvとして保存し、freadを使用する方がよいでしょう。

5
MichaelChirico

xlsx::read.xlsxXLConnect::readWorksheetFromFileの両方で同じエラーが発生しました。 RODBC::odbcDriverConnectRODBC::sqlFetchを使用できます。MicrosoftRODBCを使用すると、はるかに効率的です。

3
Jingnan Li

私はこの質問が少し古いことを知っていますが、今日これには良い解決策があります。これは、GUIを使用してRstudioでExcelをインポートしようとするときのデフォルトパッケージであり、私の状況ではうまく機能します。

library(readxl)

data <- read_Excel(filename)
2
Doongsil

CSVに変換するという@flodelの提案は、最も簡単です。何らかの理由でそれがオプションではない場合、ファイルをまとめて読み込むことができます:

 require(XLConnect)
 chnksz <- 2e3
 s <- <sheet>
 wb <- loadWorkbook(<file>, s)
 tot.rows <- getLastRow(wb)
 last.row =0
 for (i in seq(ceiling( tot.rows / chnksz) )) {
    next.batch <- readWorksheet(wb, s, startRow=last.row+i, endRow=last.row+chnksz+i)
    # optionally save next.batch to disk or 
    # assign it to a list. See which works for you. 
 } 
2
Ricardo Saporta

私はこのスレッドがまったく同じ質問に対する答えを探しているのを見つけました。 R内からxlsxファイルをハックするのではなく、pythonを使用してファイルを.csvに変換してから、標準のスキャン機能を使用してRにファイルをインポートしました。

チェックアウト: https://github.com/dilshod/xlsx2csv

0
Aaron