2012-02-17 5 views
3

다음을 수행하려면 일종의 데이터 구조가 필요합니다.DataTable에 대한 대체 데이터 구조

문자열, 정수, datetime 및 double과 같은 많은 유형으로 구성된 하나의 "집합" 많은 세트가 동적으로 추가됩니다. 정보가 가져온 곳에서 세트가 동적으로 검색됩니다.

이제 데이터 테이블을 사용하는 것이 확실한 해결책입니다. 데이터 테이블 구조를 정의하고 새 세트를 추가해야 할 때마다 새 행을 추가하십시오. 필요한 경우 데이터 테이블에서 데이터를 가져옵니다.

사실 나는 이미 데이터 테이블을 사용하여 구현했지만 사실상 어떤 이유로 든 매우 느립니다. 이것은 수천 수백만 번 수행되기 때문에 성능이 문제가 될 수 있습니다.

더 나은 성능을 제공하는 대체 데이터 테이블 형식의 데이터 구조가 있습니까? 아니면 목록 <>을 사용하여 직접 클래스를 만들어야합니까?

+0

데이터 형식을 다시 사용할 수 있습니까? 아니면 동적이어야합니까? 익명 형식을 사용할 수 있습니까? 그것은 또한 당신이 ADO.Net과 Entity Framework처럼 많은 inbuilt 기능을 가지고있는 것처럼 Data, DataBase, file, Queue 등에서 데이터를 읽는 위치에 달려 있습니다. – Lloyd

+0

안녕하세요, 일단 데이터 유형이 정적이면 다시 사용할 수 있습니다. 물론 실제 데이터가 변경되어 항목이 추가되고 제거됩니다. 나는 익명의 타입이 무엇인지 전혀 모른다. 데이터가 자체 생성되었으므로 아무 것도 읽지 않습니다 – user1035217

답변

6

사용 사례에 따라 List<object[]> (동적 스키마를 언급 했으므로)을 중앙 데이터 구조로 사용하는 것이 좋지만 나중에 필요할 경우 스키마 정보를 직접 유지 관리해야합니다.

UI에 데이터를 바인딩해야하는 경우이 방법은 추가 수동 작업을 많이 추가하므로 대용량 데이터의 백그라운드 처리에 더 적합합니다.

우리는 과거에이 접근법을 사용했으며 대량 데이터를 데이터 테이블과 비교할 때 메모리의 2/3 및 실행 시간의 80 %를 절약 할 수있었습니다.

+0

안녕하세요, 제안 해 주셔서 감사합니다. 나는 이것이 단지 효과가있을 것이라고 생각한다. 나는 이전에 객체로 작업 한 적이 없다. 80 % 실행 속도? 그것은 더 빠르지 만 많이는 아닙니다. – user1035217

+0

그것은 오해였습니다. 20 % 더 빠르지는 않았고,'DbDataReader'에서'DataTable' 코드로의 기존 오버 헤드로 인해 80 % 더 빨라졌습니다. – ntziolis

+0

아, 나는 hehe를 본다, 그 다음 그것은 우수하다. 이를 구현하고 어떤 성능 향상을 얻는 지 확인할 것입니다. 감사! – user1035217

2

다음과 같은 문제를 해결할 수있는 또 다른 방법은 메모리에 sqlite 데이터베이스를 사용하는 것입니다.

처음에는 이상하게 들릴 수도 있지만 테이블에 복잡한 구조를 넣을 수 있으며 SQL의 모든 기능을 사용하여 데이터를 처리 할 수 ​​있습니다. SQLite는 작은 lib이므로 코드를 부 풀릴 필요가 없습니다. DB를 코드에 통합하는 것은 처음에는 좀 이상해 보일 수 있습니다. 따라서 퍼포먼스는 거대한 데이터 세트에서 작동해야합니다 (DB가 만들어지는 시점부터). 그리고 그 데이터를 디스크에 저장해야한다면 이미 완료된 것입니다.

문제의 세부 사항에 따라 큰 DB 백엔드 (예 : 포스트 그레스)로 옮기는 것이 좋을지도 모르겠지만 여기에서 말하는 것은 어렵습니다. 이 아이디어를 너무 쉽게 무시하지 마십시오.

관련 문제