c-style 비교적 규모가 큰 파일 입출력에 관해 질문드립니다.
글쓴이: ozon1000 / 작성시간: 화, 2016/05/24 - 11:12오전
생물정보학 연구를 예를 들면 보통 DNA는 a.g.t.c로 구성되어 있지요.
만약에 c에서 대략 100mb정도 되는 DNA를 입력받아 무언가?를 처리해야 한다고 가정했을때,
효과적으로 입력받는 방법이 무엇이 있을까요..?
예를들어 각각의 a.g.t.c는 소문자로 입력받아야 하지만 데이터 중간중간에 대문자가 왔을때는 소문자로 처리하고,
a.g.t.c를 제외한 다른 문자가 왔을때는 입력을 받지 말아야 한다면 말이에요.
문자 하나하나 읽어오면 100mb이상의 크기가 아주 큰 데이터는 읽어오는데만 오랜시간이 걸릴거 같은데,
보통 이런 처리를 하는 특별한 기법이 존재하는지 궁금합니다!
Forums:
머신 사양에 제약을 받는 상황인가요?
20~30년 전이라면 모를까, 요즘은 스마트폰 앱도 메모리 100MB 정도는 쓰는 데 별 지장 없을텐데요.
데스크탑 정도만 되어도 이 정도 메모리는 슬쩍 할당받아서 안 내놔도 아무도 눈치못챕니다.
최소 100GB쯤은 되어야 이것저것 시도해 볼 의욕이라도 나지요. 그냥 메모리 할당해서 다 읽어들여놓고 in-memory로 처리하세요.
어디서 입력받는지에 따라 다르겠지만 OS나 C library 레벨에서 버퍼링을 지원할테고, 그걸 활용할 수 있으면 한 글자 단위로 처리해도 성능 그닥 안 잃을 겁니다.
답글 감사드립니다.
딱히 머신 사양의 제약은 없습니다.
단순히 설명을 드리자면 질문의 요지는 이것입니다.
아주 긴 문자열 데이터가 있다고 가정합니다. (대략 영어 원서라고 생각하면 편하겠네요)
이 데이터를 모두 대문자화 해서 입력을 받고 싶다고 가정했을 때, 제 생각에서는 문자 하나하나 읽어오면서
조건문안에서 대문자인것은 그대로 입력받고 소문자인것은 대문자로 변환해서 입력을 받을 거 같은데요. (굉장히 비효율적 방법인 것 같다 이거죠!!)
효율적인 방법이 있는지 궁금해요
여기서 효율적인 방법이란... 음... 기본적으로 원하는 스타일로 모두 읽어 오기 위한 최소한의 시간이 걸리는 방법이에요!
저도 계속 실험하는 중이랍니다!
tr
tr a-z A-Z < input > output
...
"아주 긴 문자열"일 경우 일단 문자열 데이터가 CPU 캐시에 안 들어갈 테니 무슨 짓을 해도 메인 메모리에서 데이터를 읽는 것보다 더 빨리 처리할 수는 없습니다.
일반적으로 CPU는 메인 메모리보다 훨씬 빠릅니다.
조건문으로 처리하든 무슨 짓을 하든 전체 수행시간에 큰 영향을 미치지 않을 거라는 데 한표.
* 그리고 "소문자를 대문자로 변환한 다음 갖다버린다"가 아닌 이상, 십중팔구 변환한 다음에 하는 일이 수행시간에 훨씬 큰 영향을 미칠 텐데요.
아하
종합해보자면, 단순히 대규모 데이터를 읽어오는 것은 그닥 많은 시간을 소비하지 않는다는 뜻이네요.
다 읽어와서야 자료구조와 알고리즘에 따라서 성능차이가 난다는 것이군요.
감사합니다.!
...
그냥 몇 년 묵은 평범한 1.5T 하드와 i5 쿼드코어가 달린 평범한 데스크탑에서 400MB짜리 디렉토리를 읽었을 때 걸리는 시간입니다.
첫번째는 디스크를 긁어오느라 10초쯤 걸리고 두번째는 캐시에 다 올라와서 1.5초 정도 걸리는군요.
100MB 이상의 크기가 아주 큰 데이터를 읽어오는데 걸리는 시간: 대략 1.5 / 4 = 0.4초? (몇 년 묵은 구닥다리 머신에서.)
댓글 달기