좋은 방법 없을까요?

jieunsys의 이미지


처음 새글을 쓰려니 겁나네요...

여러분들의 의견을 좀 듣고 싶습니다.
input 데이터가 건수로 따져서 약 500만건 정도 있습니다.
각 건마다 통계함수로 계산을 합니다. (행렬연산, 역함수... 이상한 통계함수들을 많이 호출합니다)
한번만 하는게 아니라 추가input 값으로 랜덤값을 산출해서 백만회정도 돌립니다.
(백만회가 무리가 가서 고객이랑 협의해서 어쩔수 없이 10만회로 돌립니다만, 고객은 더 많은 횟수를 원합니다)
랜덤 시드번호 주는거에 따라 동일한 결과가 산출되어야 합니다.

이거 말고도 전체 계산후 정렬하고 추가작업도 많긴 하지만 가장 큰문제는 계산횟수가 많다는거네요

이게 한번 실행하는데는 0.1초도 안걸리는데, 워낙많이 반복하다보니 소요시간이 장난아니게 늘어나서
답이 없네요...

개발은 자바1.4로 했고
input건수를 N개의 자바쓰레드로 쪼개서 산출하고 모든 자원은 풀로 동원합니다 (당근 모든 cpu 100% 먹습니다)

그런데 로직이 좀 복잡하다 보니, 한번 계산한걸 또 계산하는 부분이 몇번 나옵니다.
이걸 한번 계산해서 메모리에 저장해뒀다가 재계산 안하고 다시 꺼내 쓰려고 하면 메모리 싸이즈가
너무나 많이 필요해져서 불가능하고, 하드에 저장하는건 오히려 재계산이 빠른것 같아 포기했구요

(통계함수를 포트란이나 c로 바꾸는건 고객이 반대하네요, 지금 사용중인 자바통계라이브러리를 고수합니다)

jni로 핵심부분만 바꿀까도 해봤지만 저늠의 외부JAR땜에 손을 못댑니다.

여하튼 질문의 요지는 반복적인 연산이 필요한데 저장할 메모리는 부족하고, 그래서 계속 재계산하는 형국인데
좋은 방법이 없을까요?

이것도 일종의 시뮬레이션 분야에 해당되는건지...

kane의 이미지

500만건이 각각 독립적인 건가요? 그러면 한 건씩 메모리에 저장해가면서 하면 메모리 사용량이 줄지 않을까요?

jieunsys의 이미지

독립적이지 못한 구조에요
약식으로 표현하면 엑셀에다가 가로행엔 500만건에 해당하는 더블형 기초데이터를 놓고
세로열에는 10만회의 랜덤값에 해당하는 0~1사이의 더블형 값을 놓고
각각의 셀 모든값을 산출해야 하구요.
산출된 값이 약 8회정도 사용됩니다. (8회는 추정이고 더 확실한건 소스를 확인해야하는데 좀 복잡해서요)
한번 연산하는데도 느린데 이걸 8번씩이나 중복하니 더 느려지구요
그렇습니다....

brucewang의 이미지

정확한 상황은 모르겠습니다만, 별도의 쓰래드가 존재하고, 그렇게 table로 나눌 수 있는 것이라면 '분리 가능'한 독립적 상태라고도 생각할 수 있는것 아닐까요?

예를들어 jieunsys 님의 상황이 10000개의 쓰래드가 독립적으로 계산을 하고, 그 결과를 다시 합쳐 계산을 하는 것인데, 각 쓰래드 내부의 세부 계산 스텝의 결과 값 (재 사용해야 하는) 그 자체가 필요로 하는 메모리 공간이 너무 크다... 라면,

그 쓰래드를 별도의 머신에서 돌리면 되지 않을까요. 쓰래드 연산 결과는 네트워크로 받아 별도의 추가 연산에 사용하고 버리면 될테구요..

그런데, 추가 머신 사용이 불가한 상황이고 메모리나 CPU증설도 불가한 상황이다라면.... 어쩔 수 없이 저장데이터 사이즈의 최적화, 아니면 로직의 최적화 이 두가지를 저울질 하실 수 밖에 없겠네요.

수식계산 집중적인 프로젝트라면 예를들어 소숫점 몇십만 짜리의 정보도 중요해서 big number같은 정보를 사용하는 것이라면 data truncate는 하시면 안되겠고, 계산에 필요한 중복되는 연산 스텝의 정확한 갯수를 아신다면, 메모리가 허용하는 만큼만의 연산 스텝 결과만을 저장하셔도 어느정도 save를 하실 수 있지 않을까 하는 생각이 드네요.

아무튼 어렵고 복잡한 임무를 수행하시는 것 같아서 멋있게 보이십니다.

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

sblade의 이미지

"추가input 값으로 랜덤값을 산출해서 백만회정도 돌립니다." 부분이 어떤 말인지 정확히 이해는 안가지만, 일단 쓰여진 것만 봐서는 딱히 방법이 없는 것 같네요. 한번 실행하는데 0.01 초가 걸려도 500만건이면 14시간이 드니까 작진 않은 문제입니다.

반복된 계산을 저장하는데 엄청난 메모리가 소요된다면 그건 이미 각 계산은 몇번 반복되지 않거나, 웬만한 컴퓨터로는 돌릴 수 없을 만큼 dimensionality 가 큰 것 아닌가요? 즉 f(a,b) 의 값을 저장한다고 하면, f(x=5, y=2) 만 10만번 반복되는 상황에 유용하지 f(x=1,...,10000, y=1,...,10000) 의 10^8개의 값이 각각 열번 남짓이나 반복되는 상황에서는 메모리 엑세스를 고려하면 별로 유용하지 않습니다. 왠만큼 복잡한 단위 연산이 아니면 다시 계산하는게 낫죠. 만약 10^8 개의 값이 10만번씩 반복되는 형태의 계산이라면 이미 컴퓨터 몇개 물려서 자바로 돌릴 수준의 문제는 넘어가는 것이죠.

만약 몇개의 값이 많은 수 반복되고, 나머지의 값들은 오직 몇번 반복되는데 이것들을 다 저장하자니 메모리가 드는 상황이라면 가지치기 (pruning) 식의 방법을 생각해 볼 수 있습니다. 즉 몇번 호출되는 지를 바탕으로 많이 호출되는 값들만 저장하는 식입니다. 저장되는 값들은 동적으로 유지해줍니다. 이를테면 단위 시간동안 a,b,c,d,e,f 가 10,40,30,2,1,0 번 계산되거나 사용되었다면 우선 그중 3개만 저장합니다.
{b:40, c:30, a:10}

그다음 단위 시간동안 a,b,c,d,e,f 가 0,10,0,50,0,0 번 계산되거나 사용되었다면 앞의 셋을 업데이트한 후 다시 자릅니다.
{b:50, c:30, a:10, d:50, e:0, f:0} -> {b:50, d:50, c:30}

즉 정말 많이 사용되는 애들만 살아남죠. 하지만 이것도 단위계산이 웬만큼 복잡하지 않으면 유지에 드는 오버헤드가 더 클 가능성이 있습니다.

jieunsys의 이미지

암담하네요
딱히 방법이 없다니 ㅠ.ㅠ

가지치기(pruning)를 말씀하셨는데 제가 이해한게 맞는지는 모르겠지만
모든 데이터에 대해 함수호출 횟수는 동일합니다.

시뮬레이션분야에도 이런 유사한 케이스 있지 않을까 생각되는데
누가 좀 도와주세요

댓글 달기

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