반응형
Notice
Link
스택큐힙리스트
R로 읽을 수 있도록 거대한 (3.5 GB) CSV 파일을 줄이는 방법 본문
반응형
## 커서 위치를 따로 유지하기 위해 연결을 열기
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# 우리가 원하는 열만 이어 붙이기
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## 나머지 라인들을 읽기 위해 loop 사용
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
접근법의 실패:
- sqldf
- 이건 정확히 앞으로 이런 유형의 문제에 사용할 것입니다. 다만, 데이터가 잘 형성되어 있지 않은 경우 SQLite가 막힐 수 있습니다.
- MapReduce
- 솔직히 이 문제에 대한 문서들은 그럭저럭 위협적으로 다가와서 시도하지 못했습니다. 메모리에 객체가 있어야 하는 것 같았고, 그럴 경우 목적에 맞지 않을 것 같아서요.
- bigmemory
- 이 방법은 데이터와 청결하게 연결되지만 한 번에 하나의 유형만 처리할 수 있습니다. 결국 모든 문자 벡터가 big.table에 들어갈 때 제거되었습니다. 하지만 앞으로 대형 데이터 세트를 설계해야 한다면, 이 옵션을 사용하기 위해 숫자만 사용하는 것을 고려했을 것입니다.
- scan
- Scan은 big memory와 비슷한 유형의 문제를 가지고 있었지만, readLines의 모든 기능까지 갖추고 있었습니다. 간단히 말해서, 이번에는 필요한 기능을 갖추지 못했습니다.
답변 1
제 try with readLines
. 이 코드의 조각은 선택한 연도로 csv
를 생성합니다.
file_in <- file(in.csv,r)
file_out <- file(out.csv,a)
x <- readLines(file_in, n=1)
writeLines(x, file_out) # 헤더를 복사합니다
B <- 300000 # 한 팩의 크기가 얼마나 큰지에 따라 다릅니다
while(length(x)) {
ind <- grep(^[^;]*;[^;]*; 20(09|10), x)
if (length(ind)) writeLines(x[ind], file_out)
x <- readLines(file_in, n=B)
}
close(file_in)
close(file_out)
답변 2
대용량(3.5GB)의 CSV 파일을 R에서 읽을 수 있도록 줄이기R은 데이터 분석 및 통계 패키지로 널리 사용되며, CSV 파일은 R에서 데이터를 읽는 데에 많이 사용됩니다. 하지만 크기가 큰 CSV 파일을 R로 직접 읽으면 시스템의 성능이 저하될 수 있습니다. 이를 해결하기 위해 대용량 CSV 파일을 줄이는 방법을 알아보겠습니다.
첫 번째로 고려해야 할 점은 CSV 파일의 크기입니다. 3.5GB는 매우 큰 파일이며, 이를 한 번에 R로 읽는 것은 시스템의 부담을 초래할 수 있습니다. 따라서 이런 상황에서는 파일을 더 작은 단위로 분할하여 읽는 것이 좋습니다. 예를 들어 500MB 단위로 파일을 분할하면 R에서 처리하는 데에도 더 적은 시간이 소요될 것입니다. 이렇게 파일을 분할하려면 split 함수를 사용하면 됩니다.
두 번째로 고려해야 할 점은 필요한 데이터의 범위입니다. 대용량 CSV 파일의 경우, 전체 데이터를 읽을 필요가 없는 경우도 있습니다. 예를 들어 특정 기간의 데이터만 필요한 경우, 해당 기간에 해당하는 부분만을 읽으면 됩니다. 이를 위해 파일을 읽을 때 skip과 nrows 파라미터를 사용하면 됩니다. skip은 파일의 처음부터 건너뛸 행의 수를 설정하고, nrows는 읽을 행의 수를 설정합니다. 이렇게 설정하면 필요한 데이터만 읽을 수 있어 시스템 자원을 보다 효율적으로 활용할 수 있습니다.
세 번째로 고려해야 할 점은 데이터의 형식입니다. CSV 파일은 기본적으로 텍스트 기반 파일이므로 읽을 때 컬럼의 데이터 유형을 자세히 지정해주어야 합니다. 이를 위해 read.csv 함수의 colClasses 파라미터를 사용하면 됩니다. colClasses는 컬럼의 데이터 유형을 지정하는 데 사용되며, 예를 들어 특정 컬럼을 숫자로 읽고 싶다면 numeric으로 설정하면 됩니다. 이렇게 데이터의 형식을 명확하게 지정해주면 R은 보다 효율적으로 데이터를 읽을 수 있습니다.
어떤 크기의 CSV 파일이든 R로 읽을 때 성능을 개선하는 방법은 유사합니다. 파일 크기를 줄이고, 필요한 데이터만 읽고, 데이터의 형식을 명확하게 지정하는 등의 방법을 활용하면 R에서 대용량의 CSV 파일을 보다 효율적으로 처리할 수 있습니다. 따라서 대용량 파일을 R로 읽을 때는 이러한 요소들을 고려하여 파일을 준비하고, R의 함수들을 적절하게 활용하는 것이 필요합니다.
반응형
Comments