[질문]대규모 데이터처리에 적합한 파일 시스템

microcos의 이미지

Scientific problem을 처리하는 프로그램을 작성해야 합니다. 실제 복잡한 계산 부분은 테스트를 완료했는데, 실제 시스템 운용을 위해서 데이터를 생성하고 검색하는 부분에서 막혔습니다. 제가 전산 전공이 아니라서 단순하게 풀수 있는 건데도 못하는 건지도 모르겠네요.

아무튼 문제는,
(1) 1000만건의 source data를 제가 구현한 알고리즘으로 처리해서 double 형 결과를 8씩 얻습니다. ==> 완료
(2) 검색 조건은 double 형 값을 넣으면 1000만건의 source data중에서 일정 오차율내에 있는 모든 data를 찾는 것입니다. ==> 진행중

핵심질문: 현재, 무식한(?) 방법으로 MySQL에 모든 데이터와 연산 결과를 저장해 두었습니다. 그런데, 걱정인 것은 인덱스를 사용한다고 해도 double형이니까 제대로 동작하는지 의문입니다. 그리고, 이 방법보다 좀더 현명한 방법은 없을지... 버클리 DB가 더 적당할까요?

aero의 이미지

그러한 Scientific & Engineering Data를 다루기 위한 포멧들이
있습니다.

HDF http://hdf.ncsa.uiuc.edu/
NetCDF http://unidata.ucar.edu/packages/netcdf/index.html
등등

그 외 그러한 데이터들을 처리하기 위한 라이브러리나 프로그램등은

Scientific Data Processing & Visualization
http://sal.kachinatech.com/D/

을 뒤져보시면 많습니다.

microcos의 이미지

말씀하신 곳에 정말 좋은 자료들이 많이 있네요. 감사합니다.

아직 모두 검토해본 것운 아니지만 제가 의도하는 것과는 다른 것 같습니다. 알려주신 사이트의 라이브러리는 대부분 대용량의 행렬처리를 위한 자료구조인 것 같습니다. 저는 disk상에서 조건에 맞는(double형 인수와 오차율) 데이터를 모두 찾는 것입니다.

음... 이진검색으로 하면되는 가요? 그런데 메모리상에서 말고 파일상에서는 어떻게 하는지... 교과서에는 없는게 너무 많네요.

조금 더 도와주세요. ^^;

예)
계산결과(double)   Raw Data
------------------------------------
123.45              ABC(1:2),ABC(4:6),DEF(1,2)...
780.91              ABC(5:6),DEF(2,6)...
...
약 1000만건

aero wrote:
그러한 Scientific & Engineering Data를 다루기 위한 포멧들이
있습니다.

HDF http://hdf.ncsa.uiuc.edu/
NetCDF http://unidata.ucar.edu/packages/netcdf/index.html
등등

그 외 그러한 데이터들을 처리하기 위한 라이브러리나 프로그램등은

Scientific Data Processing & Visualization
http://sal.kachinatech.com/D/

을 뒤져보시면 많습니다.

aero의 이미지

Raw Data가 의미하는게 무엇인지는 잘 모르겠네요

대용량 데이터를 빠르게 처리하기위해서는 파일상에서
바로 읽는 즉시즉시 처리하는 방식으로는 속도를 내기 힘듭니다.

그래서 운영체제에서 부터 buffering 이란걸 하지 않습니까? :)

시스템 메모리가 허용하는 범위내에서 파일에서 데이터를 읽어 메모리에
로드한다음 처리하고 다시 파일에 write하는식으로 반복해서 처리를
하시는게 좋을거 같네요

microcos의 이미지

aero wrote:
Raw Data가 의미하는게 무엇인지는 잘 모르겠네요

raw data는 아미노산 서열입니다. 계산결과는 여러가지 파라메터로 적용된 분자량입니다. 분자량을 입력으로 검색하여 아미노산 서열의 id를 찾고자 합니다.
prajna의 이미지

심심한 김에 무식하게 테스트 해 보았습니다.

우선 DB에 1000만건의 데이터를 랜덤넘버를 이용해서 만들고,
(랜덤넘버는 소수점 이하 두자리 까지만)

정수 부분에 대하여 새로운 칼럼을 만들고,(ipart)

소수 첫째 자리에 대하여 또 새로운 칼럼을 만들었습니다. (dpart)

그리고 그 두 개의 새로운 칼럼에 대하여 인덱스를 생성하고,

double 값이 (100.1, 100.2)인 ID 를 sql로 select 하는 sql 작성

sql1 : select id from XXXX where value in (100.1, 100.2)
sql2 : select id from XXXX where  ipart=100 and dpart in (1,2)

위의 두 sql 을 실행한 결과를 비교하면,

sql1 : cpu time 2.68 초
sql2 : cpu time 0.63초

이런 무식한 방법도 쓸수 있지 않을 까요? (':D')

보이는 것이 항상 진실일까요????

alfalf의 이미지

이곳에서 Bioinformatics 하시는 분을 만나게 되서 반갑습니다.
제 기억에 MySQL 3.xx 시절에 MySQL 홈페이지에 자신들이
MySQL로 4천만건 이상의 자료를 잘 관리하여 사용하고 있다며
자랑(?)하는 것을 본일이 있습니다. 저 역시도 1천만건 정도의
자료를 고성능 PC 수준의 컴에서 잘 사용하고 있습니다.
말씀하신것처럼 간단한 검색이라면 가벼운 MySQL이 제격이 아닐까
생각합니다. 그리고, double 형의 자료도 indexing에는 문제가
없는것으로 알고 있습니다.
단백질 서열의 분자량으로 서열을 찾는 일이라면 앞으로 새롭게 추가되는
서열들의 입출력도 원활해야 할것 같은데 그렇다면 MySQL같은
RDBMS가 제격일것 같네요.
그럼..

thkim86의 이미지

전 리눅서라고 하기도 좀 그렇고 띰띰할 때 마다 이 사이트에서 글만 읽다가
오늘은 기어이 가입하고 첫 글을 답변으로 쓰게 되네요.

약 1000만건의 데이타가 테이블에 들어 있고 인덱스가 없는 Double형의 필드에 대해서 SQL문을 보내면 DBMS가 아주 열심히 일하게 됩니다. 처음부터 끝까지 조건에 맞는지 모조리 검사를 하게 되지요.

microcos 님께서 든 예제라면 저 같으면 검색 효율을 위해서 다음과 같이 하겠습니다.

1. MySQL이 처리할 수 있는 최대 범위 정수형으로 필드(NewFld라고 하죠)를 하나 추가를 합니다. 이 필드에 대해서 Unique하지 않은 인덱스를 만듭니다.

2. 그 필드에 Double형 필드값(123.45 등)에 적당한 10의 배수를 곱하여 정수로 바꾼후에 넣어 둡니다. 이때 최대값이 정수형 필드의 최대값 자리수 정도가 되도록 하면 좋습니다.

3. 이렇게 해 둔 후에 microcos 님께서 찾고자 하는 double형 값과 오차율을 이용하여 적당한 범위(A<= .. <= B, A B는 정수)를 구한 다음에 NewFld에 대해서 그 범위의 조건식을 Where 조건절 앞쪽에 부여 합니다.
(예: Where NewFld BETWEEN A and B 이런 식으로요..)

4. 그리고 그 조건의 뒷 부분에 double형 필드에 대해서 허용오차내인지 검사를 하면 됩니다.

만약 최대범위의 정수형(제가 오라클과 SQL서버, 인포믹스 이런 거만 쓰다보니 MYSQL을 잘 몰라서.. ^^;)을 초과해서 처리를 해야 한다면 적당한 길이의 문자형 필드를 만들고 Double에서 적당한 10의배수를 곱한 것을 문자열로 변환하여 저장하시고 같은 방법을 쓰면 됩니다.
이때는 자리수를 맞추기 위해서 앞쪽의 빈자리에는 000을 추가해야 합니다.(예: 000123)

맨날 꼼수로만 문제를 처리하다 보니 답변도 꼼수밖에 드릴게 없네요.

microcos의 이미지

여러분들께서 제안하신게
제가 한 방법보다는 훨씬 빠르겠네요.
일단 다시 도전을 해봐야겠네요 *^^*

댓글 달기

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