대용량(10GB 이상) 파일탐색시 속도에 관한 질문입니다.
대용량(10GB 이상) 파일탐색을 시도하려 합니다.
일단, 대용량 파일을 못읽는다 어쩐다.. 원하는 파일포인터로의 이동안된다 어쩐다..
이런 문제가 아니라는 것 밝혀둡니다.
lseek(int fildes, off_t offset, int whence);
20GB의 문서를 SEEK_SET, SEEK_CUR, SEEK_END 어느것이든 파일포인터를 위치시키는 것은 매우 빠릅니다.
계산상 0.01초 안팎의 속도가 나옵니다.
문제는 이동 후 그 부분의 데이터를
read(int fildes, void *buf, size_t nbyte);
읽어들일 때 속도가 100MB이하의 경우와 100MB이상의 경우에 대한 속도차가 이상할만큼 큰 차이를 보이고 있습니다.
20만개의 라인을 읽어 메모리에 담는다고 가정할때 100MB이하에서는 0.1~0.4초의 속도를 보이는 반면,
100MB이상에서는 1GB던 10GB던 무조건 탐색시간이 30초 이상이라는 것입니다.
(타임아웃으로 데몬 뻣습니다;;)
100MB나 10GB나 동일한 속도로 탐색이 가능한 방법이 없을까요?
아니, 왜 이런 차이가 생기는지 원인이라도 알았으면 좋겠습니다.
다시한번 강조하지만, "lseek64나 open64같은 방법으로 읽어들일 수 있습니다"라는 답을 원하는 것이 아닙니다!! 수년전부터 64bit류의 파일관련함수에 대해서는 잘 인지하고 있습니다.
대용량 파일 탐색 속도에 관해 답변 주셨으면 합니다. ^^;;
posix_fadvise(), pread() OTL
posix_fadvise(), pread()
OTL
...
readahead()
Database Management Systems
Database Management Systems 같은 책을 보시면 궁금하신 내용들에 대해 자세한 설명이 나올겁니다.
현대의 하드디스크는 Random Seek가 굉장히 느리고, Transfer(read/write)는 상대적으로 매우 빠릅니다.
그래서 대용량의 데이터를 Read할시에 속도를 빠르게 할 수 있는 유일한 방법은 RandomSeek를 없애고 파일을
순차적으로(Sequential)만 읽는 것 입니다.
문제는 논리적으로는 순차적으로 저장된 데이터라고 하더라도 물리적으로는 비순차적일 수 있는데요.
현대 OS들은 대부분 파일을 쓸때 가능하면 순차적으로 저장될 수 있는 알고리즘을 사용하고,
Read할 때도 PreFetch같은 최적화 알고리즘을 사용하여 대부분 우수한 성능을 보여줍니다.
파일을 순차적으로만 읽었는지 확인하시고, 병목현상이 CPU시간인지 I/O시간인지 확실히 하셔야 겠네요
제 경험상 1G정도의 데이터를 순차적으로만 읽을시 30초내에 충분히 가능했습니다.
답변 달아주신분들 감사합니다
bushi님 clique님 두분 답변도 맞는말이긴 하지만
comafast님이 현재상황에 가장 어울리는 답변을 달아주셨네요
덕분에 해결의 실마리가 보이게 되었습니다.
답변달아주신 모든분들 감사합니다~
댓글 달기