2009-10-26 11 views
4

많은 수의 데이터 ("수백 MB이지만 GB가 아닌"즉, OS 옆의 메모리에 잘 맞음)를 사용하는 '숫자 처리'스타일 응용 프로그램의 경우 처리를 시작하기 전에 모든 데이터를 메모리에 먼저 읽어 들여 큰 관련 데이터 세트를 읽는 동안 잠재적으로 프로그램 IO를 바인드하지 않도록하고 RAM에서로드하는 것이 좋습니다.CPU 바운드 응용 프로그램 대 IO 바운드

이 답변은 다른 데이터 백업 사용간에 변경됩니까? 즉, XML 파일, 플랫 파일, 전체 DBMS 등을 사용하는 것과 상관없이 대답이 동일할까요?

+2

@Brendan은 "RAM에서로드하는 대신"과 "디스크에서로드하는 대신에"같은 것을 의미합니다. 아, 영어의 불가사의 :-) – paxdiablo

+0

네, 완전히 잘못 읽었습니다. "RAM에서로드하는 대신"라고 말한 것 같습니다. 내 잘못이야. –

답변

8

귀하의 프로그램은 병목 현상이 무엇이든 최대한 빠릅니다. 전반적인 성능을 향상 시키려면 데이터를 메모리에 저장하는 등의 작업을 수행하는 것이 좋습니다. 그러나 성과를 향상시킬 것이라고 말하는 어렵지 않고 빠른 규칙은 없습니다. 하나의 병목을 수정하면 새로운 것이 병목이됩니다. 따라서 한 가지 문제를 해결하면 다음 병목 현상에 따라 성능이 1 % 향상되거나 1000 %가 증가 할 수 있습니다. 당신이 개선하고있는 것이 여전히 병목 일 수 있습니다.

내가는 일반적으로 1 ~ 3의 수준에 맞는 이런 것들에 대해 생각 :

  1. 열망. 디스크 나 네트워크에서 필요한 것이 있거나 계산 결과가 나오면 가져 오거나해야합니다. 이것은 프로그램하기가 가장 쉬우 며, 테스트 및 디버그가 가장 쉽지만 성능은 최악입니다. 이 부분이 병목 현상이 아니라면 괜찮습니다.
  2. 게으른. 특정 읽기 또는 계산을 수행 한 후에는 몇 밀리 초에서 영원까지 일정 기간 동안 다시 수행하지 마십시오. 이렇게하면 프로그램에 많은 복잡성이 추가 될 수 있지만 읽기 또는 계산이 비싸면 엄청난 이점을 얻을 수 있습니다. 및
  3. 과도한. 이것은 앞의 두 가지 조합과 매우 비슷합니다. 결과는 캐싱됩니다. 그러나 읽기 또는 계산 또는 요청 대신 일정한 양의 선점 활동이있어 일 수도 있고 일 수 있습니다. 파일에서 10K를 읽는 것처럼 나중에 다음 10K 블록을 원할 가능성이 높습니다. 지연 실행보다는 오히려 요청이있는 경우에 대비하여 얻을 수 있습니다.

도널드 크 누스 (Donald Knuth)가 인용 한 (너무 과도하게 사용되고 잘못 인용되는) 인용문은 "조기 최적화는 모든 악의 근원"이라고 말합니다. 열망하고 지나치게 열정적 인 솔루션은 엄청난 양의 복잡성을 추가하므로 유용한 이점을 얻지 못하는 부분에 대해서는 아무런 요령도 없습니다.

프로그래머는 무엇이 필요한지 그리고 유용할지 여부를 결정하기 전에 무엇인가에 대한 (혐의가있는) 최적화 된 버전을 만드는 실수를 범합니다.

내 자신의 문제는 다음과 같습니다. 이있을 때까지 문제를 해결하지 마십시오.

2

올바른 데이터 저장 방법을 선택하면 디스크 전체를 한 번에 읽거나 필요에 따라 읽는 것보다 더 효과적입니다.

대부분의 데이터베이스 테이블에는 각 행의 필드에 대한 표준 오프셋이 있습니다. 예를 들어, customer 레코드는 50 바이트 길이 일 수 있으며 12 번째 바이트에서 pants_size 열 시작을 가질 수 있습니다. 모든 바지 사이즈를 선택하는 것은 오프셋 12, 62, 112, 162, ad occause에서 값을 얻는 것만큼 쉽습니다.

그러나 XML은 빠른 데이터 액세스를위한 형편없는 형식입니다. 데이터를 얻기 위해서는 가변 길이의 태그와 속성을 여러 번 검토해야하며 한 레코드에서 다른 레코드로 즉시 이동할 수 없습니다. 위에서 언급 한 것과 같은 데이터 구조로 파일을 구문 분석하지 않는 한. 어떤 경우에는 RDMS와 매우 흡사 한 점이있어서 거기에 있습니다.

+0

제가 작업하고있는 특별한 경우에는 데이터 저장소를 선택하지 않습니다. 작업해야하는 타사 응용 프로그램에 의해 결정됩니다. 하나의 좋은 점을 만들기위한 +1. –

관련 문제