문제

최근에 나는 데이터 세트에 저장된 데이터로 매우 처리하는 무거운 작업을 수행해야했습니다. 내 코드에서 병목 현상을 식별하는 데 도움이되는 도구를 사용하여 충분히 무거웠습니다. 병목 현상을 분석 할 때 데이터 세트 조회가 굉장히 느리지는 않지만 (병목 현상이 아니었지만) 예상보다 느 렸습니다. 나는 항상 데이터 세트가 어떤 종류의 해시 가능한 스타일 구현을 사용하여 O (1)를 조회 할 수 있다고 가정했습니다 (또는 적어도 해시블이 생각하는 것). 내 조회 속도는 이것보다 훨씬 느린 것처럼 보였습니다.

.NET의 데이터 세트 클래스 구현에 대해 아는 사람이라면 누구나 자신이 알고있는 것을 공유하는 데 관심이 있는지 궁금합니다.

내가 다음과 같은 일을한다면 :

DataTable dt = new DataTable();
if(dt.Columns.Contains("SomeColumn"))
{
    object o = dt.Rows[0]["SomeColumn"];
}

조회 시간은 얼마나 빨리 Contains(...) 방법, 그리고 저장 값을 검색하기 위해 Object o? 나는 그것이 해시 가능처럼 매우 빠르다고 생각했을 것입니다 (해시블에 대해 이해하는 것이 맞습니다).

나는 그 코드를 메모리에서 썼으므로 어떤 것들이 "구문 적으로 정확하지"않을 수 있습니다.

도움이 되었습니까?

해결책

을 통해 반사기 Datarow [ "ColumnName"]의 단계는 다음과 같습니다.

  1. ColumnName에서 데이터 컬럼을 얻으십시오. 행의 DataColumnCollection [ "ColumnName"]을 사용합니다. 내부적으로 Datacolumncollection은 데이터 콜럼을 서두르 기 위해 저장합니다. o (1)
  2. Datarow의 행 색인을 얻으십시오. 인덱스는 내부 멤버에 저장됩니다. o (1)
  3. Datacolumn [index]을 사용하여 색인에서 데이터 컬럼의 값을 얻으십시오. Datacolumn은 데이터를 System.data.common.datastorage (내부, 초록) 멤버에 저장합니다.

    return datacolumninstance._storage.get (recordIndex);

    샘플 콘크리트 구현은 System.data.common.stringstorage (내부, 밀봉)입니다. StringStorage (및 내가 확인한 다른 콘크리트 데이터 저장소) 값을 배열에 저장합니다. get (recordindex)는 recordIndex의 값 배열에서 객체를 잡습니다. o (1)

따라서 전반적으로 당신은 O (1)이지만 작동 중에 해싱 및 기능 호출이 비용이 없다는 것을 의미하지는 않습니다. 그것은 단지 Datarows 또는 Datacolumns의 수가 증가함에 따라 더 많은 비용이 들지 않는다는 것을 의미합니다.

Datastorage가 값에 대한 배열을 사용한다는 흥미 롭습니다. 행을 추가하거나 제거 할 때 재건하기 쉽다고 상상할 수 없습니다.

다른 팁

실제로 열을 참조 할 때 정수를 사용하는 것이 좋습니다. 이는 성능 측면에서 많은 것을 향상시킬 수 있습니다. 일을 관리하기 위해 일정한 정수를 선언 할 수 있습니다. 그래서 당신이 한 일 대신에

const int SomeTable_SomeColumn = 0;

DataTable dt = new DataTable();
if(dt.Columns.Contains(SomeTable_SomeColumn))
{
    object o = dt.Rows[0][SomeTable_SomeColumn];
}

나는 어떤 유형의 해시 테이블을 사용한다고 생각하지 않지만 실제로 행과 열을 찾기 위해 더 많은 배열을 사용할 것이라고 생각하기 때문에 모든 조회는 O (n)이라고 생각합니다.

실제로 열 이름이 해시 가능에 저장되어 있다고 생각합니다. 사례에 민감한 조회를위한 O (1) 또는 지속적인 조회 여야합니다. 각각을 살펴 봐야한다면 물론 O (n)이 될 것입니다.

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