그래서 많은 세부 사항과 불완전한 행이있는 데이터 파일 (세미콜론으로 구분됨)이 있습니다 (Access 및 SQL이 질식하게 함). 40 년 동안 세그먼트, 하위 세그먼트 및 하위 하위 세그먼트 (총 ~ 200 개 요소)로 분류 된 카운티 수준 데이터 세트입니다. 요컨대, 그것은 거대하고 단순히 읽으려고하면 기억에 맞지 않을 것입니다.
그래서 내 질문은 이것이 내가 모든 카운티를 원하지만 단 1 년 (그리고 단지 최고 수준의 세그먼트 ... 결국 약 100,000 개의 행으로 이어지는)을 고려할 때 가장 좋은 방법은 무엇일까요? 이 롤업은 R?
현재 저는 한 번에 한 줄씩 읽고 작업하여 파일 크기 제한을 극복하면서 Python으로 관련없는 해를 자르려고 노력하고 있지만 R 전용 솔루션 (CRAN 패키지 괜찮음)을 선호합니다. R에서 한 번에 한 조각 씩 파일을 읽는 비슷한 방법이 있습니까?
어떤 아이디어라도 대단히 감사하겠습니다.
최신 정보:
- 제약
- 내 머신 을 사용해야 하므로 EC2 인스턴스 없음
- 가능한 한 R 전용입니다. 이 경우 속도와 자원은 문제가되지 않습니다 ... 내 기계가 폭발하지 않는다면 ...
- 아래에서 볼 수 있듯이 데이터에는 나중에 작업해야하는 혼합 유형이 포함되어 있습니다.
- 데이터
- 데이터는 3.5GB이며 약 850 만 개의 행과 17 개의 열이 있습니다.
- 2 천 개의 행 (~ 2k)이 형식이 잘못되어 17 개 대신 하나의 열만 있습니다.
- 이는 전혀 중요하지 않으며 삭제할 수 있습니다.
- 이 파일에서 ~ 100,000 행만 필요합니다 (아래 참조).
데이터 예 :
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
데이터를 R에 맞출 수 있도록 몇 개의 열을 잘라내어 사용 가능한 40 년 중 2 년 (2009-2010 년 1980-2020)을 선택하려고합니다.
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
결과 :
모든 제안을 수정 한 후 JD와 Marek이 제안한 readLines가 가장 잘 작동하기로 결정했습니다. Marek이 샘플 구현을 제공했기 때문에 수표를주었습니다.
나는 strsplit과 cat을 사용하여 내가 원하는 열만 유지하면서 최종 답변을 위해 Marek의 구현을 약간 수정 한 버전을 재현했습니다.
또한 이것은 Python보다 훨씬 덜 효율적이라는 점에 유의해야합니다 . Python은 3.5GB 파일을 5 분 안에 처리하는 반면 R은 약 60 시간이 걸립니다 ...하지만 R 만 있으면 이것이 티켓입니다.
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
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
- 이 접근 방식은 데이터에 명확하게 연결되어 있지만 한 번에 하나의 유형 만 처리 할 수 있습니다. 결과적으로 내 모든 문자 벡터가 큰 테이블에 놓일 때 떨어졌습니다. 하지만 미래를 위해 대용량 데이터 세트를 설계해야하는 경우이 옵션을 유지하기 위해 숫자 만 사용하는 것을 고려합니다.
- 주사
- 스캔은 대용량 메모리와 유사한 유형 문제가있는 것처럼 보이지만 readLines의 모든 메커니즘이 있습니다. 간단히 말해 이번에는 청구서에 맞지 않았습니다.
sed
하거나awk
만들 수 있습니다. 이것은 답변보다 해결 방법에 가깝기 때문에 주석으로 남겨 두겠습니다.