용량이 큰 파일의 데이터를 빨리 읽는 법?
글쓴이: aeronova / 작성시간: 목, 2003/01/16 - 1:46오전
안녕하세요.
궁금한 점이 있는데요,
용량이 아주 큰 파일의 데이터를 빨리 읽으려면 어떻게 하나요?
음, 제가 본 Tecplot이라는 데이터를 그리는 상용 코드가 하는 짓을 보니까,
우선 데이터 파일이 좀 크다 싶으면 Binary로 바꾼다고 메시지가 뜨더군요.
이걸 보니까 Ascii를 Binary로 바꿔서 읽으면 빠른 것 같은데 왜 그렇지요?
...허접 질문 같지만 항상 볼때마다 궁금해서요.
아시는 분 갈켜 주시면 감사하겠습니다.
그럼 좋은 하루 보내세요~.
Forums:
아마.... 이런 이유가 아닐지....
어셈블리를 해보면 기본적으로 모든 것을 바이너리로 읽어들입니다.
아무래도 Ascii 모드에서는 Binary 모드보다 오버헤드가 있겠지요.
그냥 답변
잘은 모르지만,
아는 한도내에서 설명드립니다.
ascii mode와 binary 모드는 기본적으로 같습니다.
그러나,
ascii mode에서는
line 단위로 read/write를 하기 때문에
중간에 stream buffer를 두기 마련입니다.
이과정에서의 overhead를 줄이기 위해
대형 file에서는
binary mode로 open해서
통짜로 메모리에 올린다음에,
이를 처리하는 방법도
있을 수 있습니다.
그렇게 하면, 속도가 조금 빨라지긴 하지요
바이너리로 읽으면 빠른것은...
데이터에 대한 체킹을 하지 않기 때문입니다.
아스키로 데이터를 읽을 경우 LF 등의 제어문자를 판독해서 함수에 따라서 거기까지만 읽어 들이는 동작을 합니다.
그밖에도 필요한대로 아스키로 데이터 읽은것은 여러가지 동작을 할필요가 있기 때문이지요.
그러나 바이너리는 버퍼를 잡아놓고 한꺼번에 읽어들이기 때문에 오버헤드가 훨씬 적습니다. 경우에 따라서는 CPU 대신에 DMA 가 읽어들이기도 합니다.
- 겨울아찌 -
- 겨울아찌 -
winchild@gmail.com
한번에 최대한 크게 읽는 것도 하나의 방법입니다.1024씩 읽을
한번에 최대한 크게 읽는 것도 하나의 방법입니다.
1024씩 읽을 때,
2048
4096
8192
32K 라면 32K일 때 가장 높은 성능을 나타냅니다.
한번에 읽어서 메모리에 올리는게 가장 좋겠지만...
메모리가 안 받쳐준다면, 적당히 살펴봐서 읽어주는게 낳을것
같네요.
=========================
CharSyam ^^ --- 고운 하루
=========================
빨리 file을 읽으려면.
읽어 들이는 버퍼의 크기를 크게 하면 도움이 됩니다.
단순히 크게 키우는 것보다는,
stat(2) 함수를 써서, file system block 크기 (st_blksize)를 알아낸 다음,
그 크기만큼의 버퍼를 할당합니다.
또한 특별한 처리가 필요한 것이 아니라면, 8bit로 읽는 것보다, 16비트, 32, 64비트 로 처리하는 것이 빠릅니다.
예를 들어 단순히 파일을 복사한다거나 할 때에는 64bit나 32bit로 읽어 쓴 다음,
마지막에 남은 부분만 8bit로 처리하면 좋습니다.
지금까지 말한 내용은 전부 GNU fileutils에 포함되어 있는 cat의 소스에 다
나와 있습니다.
Advanced Programming in the UNIX Envrionment에 보면, 일반 파일을 복사할때에는 mmap(2)를 쓰는 memory mapped I/O가 더 빠르다고 나와 있습니다. (12.9장) 실제 테스트는 해보지 않았지만. wink
그럼 이만.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
시스템 크기 만큼 할당을 받아 처리하는 것이 가장 빠를듯 싶지만실
시스템 크기 만큼 할당을 받아 처리하는 것이 가장 빠를듯 싶지만
실제로 해보면, 그것보다 더 큰 블록으로 읽기나 쓰기를 할 때 같은 양을
처리한다면 훨씬 빠른 것을 볼 수 가 있습니다.
제 생각에는
4096이 시스템 블럭 사이즈라고 하더라도
for( ;; )
read 4096
은 for 루프가 끝나고 하드 디스크의 암이 다른 곳으로 이동할 가능성이 있습니다.(스케줄링 때문에)
하지만
for( ;; )
read 32k
라면 read 동안에는 암이 이동하지 않겠죠. 이래서 더 빠르지 않을 까
생각을 합니다. 이건 제 경험에 의한거니... ^^ 아닐수도
=========================
CharSyam ^^ --- 고운 하루
=========================
댓글 달기