스택큐힙리스트

CSV 파일을 조각조각 읽는 방법에 대한 전략은 무엇인가요? 본문

카테고리 없음

CSV 파일을 조각조각 읽는 방법에 대한 전략은 무엇인가요?

스택큐힙리스트 2023. 11. 1. 23:13
반응형

내 컴퓨터에는 충분한 RAM이 없는 중간 크기 파일 (4GB CSV)이 있습니다 (64-bit Windows의 8GB). 과거에는 클러스터 노드에로드하여 읽었지만, 새로운 클러스터는 하드웨어가 각 머신당 16GB를 가지고 있음에도 불구하고 프로세스를 임의로 4GB의 RAM으로 제한하는 것 같습니다. 따라서 단기적인 해결책이 필요합니다.


가용 메모리 제한에 맞게 일부 CSV 파일을 R로 읽을 수 있는 방법이 있을까요? 이렇게하면 파일의 1/3을 한 번에 읽고 필요한 행과 열로 하위 집합을 만든 다음 다음 1/3을 읽을 수 있습니다.


큰 메모리 트릭을 사용하여 전체 파일을 읽을 수 있다는 것을 알려주신 댓글러에게 감사드립니다:
R에서 매우 큰 테이블을 빠르게 데이터프레임으로 읽기

나는 몇 가지 다른 해결 방법을 생각할 수 있습니다 (예: 좋은 텍스트 편집기에서 열고, 관측치의 2/3을 삭제한 다음 R에로드), 그러나 가능하면 피하고 싶습니다.


그러니 현재로서는 여전히 조각조각 읽는 것이 가장 좋은 방법처럼 보입니다.

답변 1

이 접근 방식의 장점은 연결입니다. 이 단계를 생략하면 작업이 조금 느려질 수 있습니다. 연결을 수동으로 열면 데이터 집합이 열리고 close 함수를 호출할 때까지 닫지 않습니다. 데이터 집합을 루프를 돌면서 항상 현재 위치를 유지할 수 있습니다. 1e7개의 행으로 이루어진 데이터 집합이 있다고 가정해보세요. 또한 한 번에 1e5개의 행을 로드하려고 합니다. 연결을 열기 때문에 첫 번째 1e5개의 행을 실행하여 read.csv(con, nrow=1e5,...)로 가져오고, 두 번째 청크를 가져오려면 read.csv(con, nrow=1e5,...)를 실행하고, 이런 식으로 계속합니다....

만약에 우리가 연결을 사용하지 않는다면, 우리는 청크를 같은 방식으로 얻을 수 있을 것입니다. read.csv(file.csv, nrow=1e5,...), 하지만 다음 청크를 얻기 위해서는 read.csv(file.csv, skip = 1e5, nrow=2e5,...)가 필요합니다. 분명히 이것은 비효율적입니다. 우리가 방금 1e5번째 행을 읽었다는 사실에도 불구하고, 1e5+1번째 행을 다시 찾아야 합니다.


마지막으로, data.table::fread은 훌륭합니다. 하지만 연결을 전달할 수 없습니다. 따라서 이 방식은 작동하지 않습니다.


이게 누군가에게 도움이 되기를 바랍니다.


업데이트


사람들이 이 게시물에 좋아요를 많이 누르고 있으므로, 한 가지 간단한 생각을 추가하려고 합니다. 새로운 readr::read_csvread.csv와 마찬가지로 연결을 전달할 수 있습니다. 그러나, 이는 대략 10배 빠르다고 광고되었습니다.

답변 2

CSV 파일의 조각별 읽기 전략
CSV(Comma Separated Values) 파일은 데이터를 쉼표로 구분하여 저장하는 형식으로, 많은 양의 데이터를 처리하는 데 널리 사용됩니다. 때로는 대용량 CSV 파일을 읽고 처리해야 할 때가 있는데, 이때는 파일을 작은 조각으로 분할하여 읽는 전략이 필요합니다. 이 글에서는 CSV 파일을 조각별로 읽는 전략에 대해 소개하겠습니다.
1. 파일을 여러 부분으로 분할하기:
대용량의 CSV 파일을 모두 메모리에 한 번에 읽을 수 없을 수 있으므로, 파일을 여러 개의 작은 부분으로 나누는 것이 가장 기본적인 전략입니다. 파일로부터 작은 블록을 읽어 메모리에 저장한 후, 해당 블록의 데이터를 처리한 다음 다음 블록을 읽는 방식입니다.
2. 반복적인 읽기 방식 사용하기:
전체 파일을 한 번에 처리하는 것이 아니라, 여러 번의 반복을 통해 파일을 읽는 방식입니다. 여기서는 각 반복마다 일부 데이터를 읽어 처리하는 방식을 사용합니다. 이를 통해 파일의 처음부터 끝까지 사전에 메모리에 모두 로드할 필요 없이, 작은 블록 단위로 조각조각 읽어 처리할 수 있습니다.
3. 스트리밍(Streaming) 방식 사용하기:
CSV 파일을 스트리밍 방식으로 읽는다면, 파일을 한 번에 읽지 않고 필요할 때마다 데이터를 추출할 수 있는 효과적인 방법입니다. 이 방식은 파일을 임시 버퍼에 저장하지 않고, 작은 조각을 읽어 처리하므로서 시스템의 메모리 사용량을 최소화할 수 있습니다. 스트리밍 방식은 대용량 CSV 파일의 처리를 효율적으로 할 수 있는 방법 중 하나입니다.
4. 병렬 처리 방식 사용하기:
대용량 CSV 파일을 조각별로 읽을 때, 병렬 처리 방식을 사용하면 처리 속도를 높일 수 있습니다. 여러 개의 코어를 활용하여 파일을 동시에 읽거나, 여러 개의 파일 조각을 병렬로 처리하는 방식을 적용할 수 있습니다. 따라서 시간을 단축하고 효율적으로 데이터를 처리할 수 있습니다.
이렇게 대용량 CSV 파일을 조각조각 읽는 전략은 파일 크기와 성능 요구 사항에 따라 다를 수 있습니다. 하지만 위에 소개한 전략들을 적절히 활용한다면, 대용량 CSV 파일을 효율적으로 처리할 수 있을 것입니다. 이러한 전략을 이해하고 사용하여 데이터 작업을 더욱 효율적으로 수행할 수 있기를 바랍니다.

반응형
Comments