큰 xlsx 파일을 R로 가져오시겠습니까?
"빅" xlsx 파일(~20Mb)에서 데이터를 가져오는 방법을 아는 사람이 있는지 궁금합니다.저는 xlsx와 xlConnect 라이브러리를 사용하려고 했습니다.유감스럽게도 사용자 Java와 저는 항상 동일한 오류가 발생합니다.
> 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
하지만 아무 것도 소용없어요.아이디어 있는 사람?
누군가 분석을 위해 (다른) Excel 파일을 보냈을 때 이 질문을 우연히 발견했습니다.이것은 그렇게 크지도 않지만 어떤 이유에서든지 비슷한 오류에 부딪혔습니다.
java.lang.OutOfMemoryError: GC overhead limit exceeded
@DirkEdelbuettel의 이전 답변에 대한 의견을 바탕으로 openxlsx 패키지(http://cran.r-project.org/web/packages/openxlsx/) 를 설치했습니다.그리고는 달려갔습니다.
library("openxlsx")
mydf <- read.xlsx("BigExcelFile.xlsx", sheet = 1, startRow = 2, colNames = TRUE)
그것은 바로 제가 찾던 것이었습니다.사용하기 쉽고 빠르게 작동합니다.제 새 BFF입니다.@DirkEdelbuettel에 대한 팁 감사합니다!
options(java.parameters = "-Xmx2048m") ## memory set to 2 GB
library(XLConnect)
Java 구성 요소가 로드되기 전에 "java"를 사용하여 더 많은 메모리를 허용합니다.그런 다음 XL Connect 라이브러리를 로드합니다(Java 사용).
바로 그겁니다.워크시트 읽기 등을 사용하여 데이터 읽기를 시작합니다. :)
저는 @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 패키지는 엑셀 파일에서 엄청난 양의 데이터를 읽고 쓰는 데 매우 유용하며 엑셀 내에서 사용자 지정 포맷을 위한 많은 옵션이 있습니다.
흥미로운 사실은 우리가 여기서 자바 힙 메모리에 대해 신경 쓸 필요가 없다는 것입니다.
이 질문이 좀 오래된 것으로 알고 있지만, 요즘에는 이것에 대한 좋은 해결책이 있습니다.이것은 당신이 GUI로 R studio에서 excel을 가져오려고 할 때 기본 패키지이며 내 상황에서 잘 작동합니다.
library(readxl)
data <- read_excel(filename)
표준 Excel->R 질문에서 언급했듯이, 최근에 나타난 대안은 다음과 같습니다.readxl
패키지, 예를 들어, 제가 발견한 것과 비교했을 때 꽤 빠른 것으로 나타났습니다.openxlsx
그리고.xlsx
.
즉, 스프레드시트 크기의 한계가 있기 때문에 데이터를 저장하는 것이 더 나을 것입니다..csv
및사용을 사용합니다.fread
.
저도 두 가지 모두에서 같은 오류가 있었습니다.xlsx::read.xlsx
그리고.XLConnect::readWorksheetFromFile
아마도 당신은 사용할 수 있습니다.RODBC::odbcDriverConnect
그리고.RODBC::sqlFetch
훨씬 더 효율적인 마이크로소프트 RODBC를 사용합니다.
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.
}
저는 똑같은 질문에 대한 답을 찾고 있는 이 스레드를 발견했습니다.R 내에서 xlsx 파일을 해킹하려고 시도하는 것보다 python을 사용하여 파일을 .csv로 변환한 다음 표준 스캔 기능을 사용하여 파일을 R로 가져오는 것이 제게 효과적이었습니다.
체크아웃: https://github.com/dilshod/xlsx2csv
언급URL : https://stackoverflow.com/questions/19147884/importing-a-big-xlsx-file-into-r
'sourcecode' 카테고리의 다른 글
Xcode에서 "Linked Frameworks"가 아닌 "내장 바이너리"를 사용해야 하는 경우는 언제입니까? (0) | 2023.04.29 |
---|---|
엑셀에서 hh:mm:ss.000을 밀리초로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.29 |
Visual Studio에서 이클립스의 ALT+UP/DOWN(이동선)에 해당하는 것은 무엇입니까? (0) | 2023.04.29 |
ASP 간의 연결 풀 문제를 해결하려면 어떻게 해야 합니까?NET 및 SQL 서버? (0) | 2023.04.29 |
UILabel에서 텍스트를 애니메이션으로 변경합니다. (0) | 2023.04.29 |