문제

떤 한 나를 도울 방법을 이해하려고 노력 하드 드라이브를 찾는다.

나는 작은 바이너리 데이터베이스 파일에 읽기 성능을 절대적으로 필수적입니다.필요할 경우를 건너뛰고 몇 바이트에서 파일은 그것을 사용하여 빠르게 찾()또는 읽기(음)폐기 원치 않는 데이터입니다.

는 경우 평균 검색 시간의 하드 드라이브 10ms 이와 읽기 속도 300MB/s 계산는 그것의 빠른 읽()이상을 추구()값보다 작은 3 메가바이트.은 사실입니까?이 있는 오버헤드를 수행하는 경우에 새로이 추구하는 독서 기존 스트림하지 않는가?

어떤 생각을 할 수가 더 적합한 파일 구조에 대한 인덱스입니다.

Entry1:Value:PointerIntoToData
Entry2:Value:PointerIntoToData
Entry3:Value:PointerIntoToData
Data, Data, Data

Or

Entry1:Value:Data
Entry2:Value:Data
Entry3:Value:Data

읽을 때의 항목이지 않은 경우에는 올바른 그것은 무시됩니다.그래서 스트리밍할 때 파일이 더 빠르다:1.을 때의 항목은 필요하지 사용이 추구하는()를 건너다 2.할 때 항목은 필요하지 않기를 폐기 데이터 3.거나 사용이 처음 구조,경우 항목은 필수 seek()데이터 저장소이다.

항목은 4 바이트 값은 8 바이트&데이터가 12 킬로바이트

환호

도움이 되었습니까?

해결책

모든 시스템 호출은 변화하는 위치에서 파일을 다 읽은 것입니다.그것은 움직이지 않는 드라이브 머리입니다.드라이브 머리에 이동 할 때 데이터를 읽거나 쓰지 않아가 직접 제어 무엇 OS 다음 할 것입니다.

많은 양의 데이터를 읽어 당신이 필요하지 않은 영향 때문에 모든 데이터를 읽을 필요한 공간에 OS buffers 및 원인이 오래된 데이터가 삭제됩니다.그래서 사용하여 찾는 이가 큰 파일은 엉망으로 파일 시스템 캐시 적습니다.


모든 쓰 아래로 가정할 수 없습니다에 맞게 데이터베이스 전체가 메모리에 있습니다.할 수 있는 경우,다만습니다.읽는 모든 것을 추가하려고 하는 새로운 변경된 데이터에서 파일의 끝입니다.걱정하지 않는 낭비되는 공간,그냥 몇 가지를 압축에 한 번하는 동안.


데이터베이스가 너무 크:

데이터를 읽고 쓸 물리적 드라이브 블록에서(또는 페이지)입니다.마찬가지로 기본적인 단위의 디스크에서 당신의 OS 페이지입니다.경 OS 캐시 데이터를 디스크에서 그것은 또한에서는 전체 페이지입니다.그래서 생각해야하는지 여부를 앞으로 이동 몇 바이트를 사용하여 받거나 읽는 조금도 감각이다.만약 당신이 그것을 만들고 싶어 빠르고,당신은 계정에 필요한 디스크 IO 정말 작동합니다.

첫째,이미 언급에 의해 nobugz,해당 지역의 참조.는 경우 사용자가 사용하는 데이터에서는 각 작동이 가까이 함께 위치한 파일에서 당신의 OS 필요한 것을 읽거나 쓰기 위해 적은 페이지입니다.다른 한편으로는 경우에,당신은 확산하는 데이터는,많은 페이지를 할 필요가 읽거나 쓰고,한 번에 하는 것입니다 항상 느립니다.

으로 데이터 구조에 대한 인덱스입니다.일반적으로 그들은 조직으로 B-트.그것은 데이터 구조를 위해 특별히 만들어진 효과적인 중의 대량의 데이터를 메모리에 저장된 페이지를 읽고 씁니다.

과 전략을 모두를 위한 데이터를 구성하는 데에 사용되는습니다.예를 들어,MS SQL 서버는 기본적으로 데이터를 저장하는 첫 번째 방법:데이터는 별도로 저장 및 인덱스만을 포함에서 데이터 인덱스 열 및 물리적 주소의 데이터 행에서 파일이 있습니다.그러나 정의한 경우에는 클러스터 인덱스는 다음은 모든 데이터 저장됩니다 내에서 이러 인덱스입니다.다른 모든 인덱스는 지점을 통해 데이터 인덱스 키를 대신할 수 있습니다.첫번째 방법은 간단하지만 다른 수 있습이 훨씬 더 효과적인 경우가 종종의 스캔 범위의 데이터를 기반으로 클러스터 인덱스입니다.

다른 팁

"절대적으로 필수"가 액세스 할 수 있는가? 아직 최적화되지 않은 솔루션으로 응용 프로그램을 테스트 했습니까? 그 테스트 중에, 당신은 진짜 병목 현상은? 그렇지 않은 경우 결과에 놀랄 것입니다.

다음으로 다른 방법을 시도하고 실행 시간을 비교하십시오. 다른 시스템로드 (즉, 애플리케이션을 제외하고 시스템이 유휴 상태 일 때 및 바쁜 경우)에서 테스트하십시오.

새롭고 빠른 하드 드라이브에 작업을하는 내부 최적화가 다른 내부 최적화가있는 경우 현재 하드 드라이브를 기반으로 한 최적화가 잘못 될 수 있습니다.

순차적 판독은 항상 머리를 찾는 것이 필요하지 않은 것보다 더 빠릅니다 (위치 찾기가 아님). 순차적 판독을위한 전형적인 하드 드라이브 성능은 50-60 mb/sec이며, 최악의 ~ 0.4 mb/sec까지 떨어집니다. 드라이브 헤드가 배치되면 본질적으로 실린더의 데이터를 무료로받습니다. 파일 시스템 캐시는 실린더에서 사전 읽기 섹터를 통해이를 활용합니다.

그러나 디스크 실린더에 데이터 배치를 제어 할 수 없습니다. 또한 구동 형상을 추측 할 수 없습니다. 볼륨이 단편화되면 시간이 지남에 따라 처리량이 상당히 악화 될 수 있습니다. 메모리에서 데이터를 캐싱하여 Perf를 찾아야합니다. 그 시점에서 당신은 걱정합니다 참조의 위치.

파일을 항상 메모리에 매핑 한 다음 포인터 등을 통해 액세스 할 수 있습니다. 그것은 일반적으로 액세스를 더 간단하게 만들어야합니다 그리고 더 빠르게.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top