c-style 비교적 규모가 큰 파일 입출력에 관해 질문드립니다.

ozon1000의 이미지

생물정보학 연구를 예를 들면 보통 DNA는 a.g.t.c로 구성되어 있지요.
만약에 c에서 대략 100mb정도 되는 DNA를 입력받아 무언가?를 처리해야 한다고 가정했을때,

효과적으로 입력받는 방법이 무엇이 있을까요..?

예를들어 각각의 a.g.t.c는 소문자로 입력받아야 하지만 데이터 중간중간에 대문자가 왔을때는 소문자로 처리하고,
a.g.t.c를 제외한 다른 문자가 왔을때는 입력을 받지 말아야 한다면 말이에요.

문자 하나하나 읽어오면 100mb이상의 크기가 아주 큰 데이터는 읽어오는데만 오랜시간이 걸릴거 같은데,
보통 이런 처리를 하는 특별한 기법이 존재하는지 궁금합니다!

익명 사용자의 이미지

20~30년 전이라면 모를까, 요즘은 스마트폰 앱도 메모리 100MB 정도는 쓰는 데 별 지장 없을텐데요.
데스크탑 정도만 되어도 이 정도 메모리는 슬쩍 할당받아서 안 내놔도 아무도 눈치못챕니다.

최소 100GB쯤은 되어야 이것저것 시도해 볼 의욕이라도 나지요. 그냥 메모리 할당해서 다 읽어들여놓고 in-memory로 처리하세요.
어디서 입력받는지에 따라 다르겠지만 OS나 C library 레벨에서 버퍼링을 지원할테고, 그걸 활용할 수 있으면 한 글자 단위로 처리해도 성능 그닥 안 잃을 겁니다.

ozon1000의 이미지

딱히 머신 사양의 제약은 없습니다.

단순히 설명을 드리자면 질문의 요지는 이것입니다.
아주 긴 문자열 데이터가 있다고 가정합니다. (대략 영어 원서라고 생각하면 편하겠네요)
이 데이터를 모두 대문자화 해서 입력을 받고 싶다고 가정했을 때, 제 생각에서는 문자 하나하나 읽어오면서
조건문안에서 대문자인것은 그대로 입력받고 소문자인것은 대문자로 변환해서 입력을 받을 거 같은데요. (굉장히 비효율적 방법인 것 같다 이거죠!!)

효율적인 방법이 있는지 궁금해요

여기서 효율적인 방법이란... 음... 기본적으로 원하는 스타일로 모두 읽어 오기 위한 최소한의 시간이 걸리는 방법이에요!
저도 계속 실험하는 중이랍니다!

Prentice의 이미지

tr a-z A-Z < input > output

jick의 이미지

"아주 긴 문자열"일 경우 일단 문자열 데이터가 CPU 캐시에 안 들어갈 테니 무슨 짓을 해도 메인 메모리에서 데이터를 읽는 것보다 더 빨리 처리할 수는 없습니다.

일반적으로 CPU는 메인 메모리보다 훨씬 빠릅니다.

조건문으로 처리하든 무슨 짓을 하든 전체 수행시간에 큰 영향을 미치지 않을 거라는 데 한표.

* 그리고 "소문자를 대문자로 변환한 다음 갖다버린다"가 아닌 이상, 십중팔구 변환한 다음에 하는 일이 수행시간에 훨씬 큰 영향을 미칠 텐데요.

ozon1000의 이미지

종합해보자면, 단순히 대규모 데이터를 읽어오는 것은 그닥 많은 시간을 소비하지 않는다는 뜻이네요.

다 읽어와서야 자료구조와 알고리즘에 따라서 성능차이가 난다는 것이군요.

감사합니다.!

jick의 이미지

그냥 몇 년 묵은 평범한 1.5T 하드와 i5 쿼드코어가 달린 평범한 데스크탑에서 400MB짜리 디렉토리를 읽었을 때 걸리는 시간입니다.

$ du -h somedir
432M    somedir
 
$ time egrep '[ACGT][acgt]' somedir/* | wc -l
13639
 
real    0m9.387s
user    0m1.822s
sys     0m0.230s
 
$ time egrep '[ACGT][acgt]' somedir/* | wc -l
13639
 
real    0m1.550s
user    0m1.478s
sys     0m0.082s

첫번째는 디스크를 긁어오느라 10초쯤 걸리고 두번째는 캐시에 다 올라와서 1.5초 정도 걸리는군요.

100MB 이상의 크기가 아주 큰 데이터를 읽어오는데 걸리는 시간: 대략 1.5 / 4 = 0.4초? (몇 년 묵은 구닥다리 머신에서.)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.