용량이 큰 파일의 데이터를 빨리 읽는 법?

aeronova의 이미지

안녕하세요.
궁금한 점이 있는데요,
용량이 아주 큰 파일의 데이터를 빨리 읽으려면 어떻게 하나요?

음, 제가 본 Tecplot이라는 데이터를 그리는 상용 코드가 하는 짓을 보니까,
우선 데이터 파일이 좀 크다 싶으면 Binary로 바꾼다고 메시지가 뜨더군요.
이걸 보니까 Ascii를 Binary로 바꿔서 읽으면 빠른 것 같은데 왜 그렇지요?

...허접 질문 같지만 항상 볼때마다 궁금해서요.
아시는 분 갈켜 주시면 감사하겠습니다.
그럼 좋은 하루 보내세요~.

roid1911의 이미지

어셈블리를 해보면 기본적으로 모든 것을 바이너리로 읽어들입니다.
아무래도 Ascii 모드에서는 Binary 모드보다 오버헤드가 있겠지요.

drinkme의 이미지

잘은 모르지만,
아는 한도내에서 설명드립니다.

ascii mode와 binary 모드는 기본적으로 같습니다.
그러나,
ascii mode에서는
line 단위로 read/write를 하기 때문에
중간에 stream buffer를 두기 마련입니다.

이과정에서의 overhead를 줄이기 위해
대형 file에서는
binary mode로 open해서
통짜로 메모리에 올린다음에,
이를 처리하는 방법도
있을 수 있습니다.

그렇게 하면, 속도가 조금 빨라지긴 하지요

winchild의 이미지

데이터에 대한 체킹을 하지 않기 때문입니다.
아스키로 데이터를 읽을 경우 LF 등의 제어문자를 판독해서 함수에 따라서 거기까지만 읽어 들이는 동작을 합니다.

그밖에도 필요한대로 아스키로 데이터 읽은것은 여러가지 동작을 할필요가 있기 때문이지요.

그러나 바이너리는 버퍼를 잡아놓고 한꺼번에 읽어들이기 때문에 오버헤드가 훨씬 적습니다. 경우에 따라서는 CPU 대신에 DMA 가 읽어들이기도 합니다.

- 겨울아찌 -

- 겨울아찌 -
winchild@gmail.com

charsyam의 이미지

한번에 최대한 크게 읽는 것도 하나의 방법입니다.

1024씩 읽을 때,
2048
4096
8192
32K 라면 32K일 때 가장 높은 성능을 나타냅니다.

한번에 읽어서 메모리에 올리는게 가장 좋겠지만...
메모리가 안 받쳐준다면, 적당히 살펴봐서 읽어주는게 낳을것
같네요.

=========================
CharSyam ^^ --- 고운 하루
=========================

cinsk의 이미지

읽어 들이는 버퍼의 크기를 크게 하면 도움이 됩니다.

단순히 크게 키우는 것보다는,

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

그럼 이만.

charsyam의 이미지

시스템 크기 만큼 할당을 받아 처리하는 것이 가장 빠를듯 싶지만

실제로 해보면, 그것보다 더 큰 블록으로 읽기나 쓰기를 할 때 같은 양을

처리한다면 훨씬 빠른 것을 볼 수 가 있습니다.

제 생각에는

4096이 시스템 블럭 사이즈라고 하더라도

for( ;; )
read 4096

은 for 루프가 끝나고 하드 디스크의 암이 다른 곳으로 이동할 가능성이 있습니다.(스케줄링 때문에)

하지만
for( ;; )
read 32k

라면 read 동안에는 암이 이동하지 않겠죠. 이래서 더 빠르지 않을 까

생각을 합니다. 이건 제 경험에 의한거니... ^^ 아닐수도

=========================
CharSyam ^^ --- 고운 하루
=========================

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.