2011-01-05 5 views
5

10 열 미만이지만 약 50k 행의 문자열 격자를 사용해야 할 수도 있습니다.대형 문자열 격자를 처리하는 방법은 무엇입니까?

실험에 따르면 CPU가 매우 반응하지 않는 것으로 나타났습니다.

모든 포인터?

코드 또는 구성 요소?

Delphi (7) 빌드 또는 TMS (라이센스가있는 경우) 또는 FOSS (상업적 사용의 경우)가 바람직합니다.


업데이트 : 가상 트리보기 등을 사용하도록 알려주지 마십시오. 제발 나에게 뭔가를 배울 수 있도록 말해주십시오. 감사.

+1

코드가 왜 느린 지 알 수없는 경우 몇 가지 코드를 게시해야합니다. –

+1

먼저 50K 행을로드해야하는 이유는 무엇입니까? 화면에 한 번에 25-50 개 정도만 표시 할 수 있습니까? 두 번째로 시스템 (또는 가상 머신)의 메모리 용량과 50K 행의 용량을 알려주지 않았습니다. 시스템 메모리 이상을 필요로한다면 "가상 메모리"가 작동하여 HDD를 사용할 것입니다. , 아마 어쩌면 당신의 SSD) RAM보다 느리다. 내 발언을 공격으로 생각하지 마라, 나는 당신의 문제를 이해하려고 노력하고있다. – ComputerSaysNo

+0

+1 충분히 공정한 질문입니다. 나는 20-50 개의 행만 표시 할 수 있지만 어딘가에 데이터가 "필요"합니다. Mayeb 나는 문자열 격자가 아닌 DB에 넣을 수도 있고 아니면 내 프로그램에 그대로두고 db를 사용하지 않을 수도 있습니다. 어느 경우 든 두 세트의 데이터를 갖게 될 것입니다. 여기에는 50 개의 행을 유지하는 문자열 격자와 나머지를 유지하는 soemwhere가 있으며, 이들을 동기화하는 데 까다로운 코드가 필요합니다. 내가 왜이 질문을하고 있는지를 반영하는 잘 만들어진 견해. – Mawg

답변

5

나는이 문제가 TStringGrid에이 숫자를 추가 한 것이 아닌 것으로 생각합니다.

100K 행을 추가하는 데 1 초 (700ms)가 걸리지 않습니다 (고급형 PC가 아닌 듀얼 코어 만 사용).

procedure TForm1.btn1Click(Sender: TObject); 
Const 
    arr : array[1..5] of string = ('One','Two','Three','Four','Five'); 
    Rows = 100000; 
var 
    I: Integer; 
    F,E : Integer; 
begin 
    StringGrid1.RowCount := Rows; 
    F := GetTickCount; 
    for I := 0 to Rows do 
    begin 
    StringGrid1.Cells[1,I] := Arr[1] + IntToStr(I); 
    StringGrid1.Cells[2,I] := Arr[2]+ IntToStr(I); 
    StringGrid1.Cells[3,I] := Arr[3]+ IntToStr(I); 
    StringGrid1.Cells[4,I] := Arr[4]+ IntToStr(I); 
    StringGrid1.Cells[5,I] := Arr[5]+ IntToStr(I); 
    end; 
    E := GetTickCount; 
    ShowMessage(Inttostr(E-F)); 
end; 

코드 속도가 느린 것 같습니까? 데이터베이스에서 데이터를 가져 옵니까? 그렇다면 코드의 병목 현상이 발생하며 사용자에게 표시 할 WHATEVER GRID에 50k를 추가합니다. "나쁜 습관".

그리고 코드를 표시하지 않고 느린 이유를 설명하기가 어렵습니다.

+1

그리드에 일종의 필터링이 내장되어 있다면 50K 행은 괜찮다. 백엔드에서 필터링을 수행하는 것이 가장 좋고/가장 성능이 좋은 해결책은 아니지만 예를 들어 OLAP/큐브를 생각하면된다. – mjn

+1

@mjn, u r right하지만 그의 질문은 일반 StringGrid 또는 TMS 하나에 50k를 추가하는 것에 대해 질문합니다. OLAP/큐브 작업과 관련이 없습니다. –

+0

+1 (+1 이상을 줄 수 있기를 바랍니다) 코딩에 감사드립니다. 내 문제는 비 DB 인식 문자열 격자를 사용하여 db 수 있습니다 생각합니다. 하지만 DB를 인식하는 그리드를 사용하면 훨씬 더 나아질 것인가 아니면 여전히 매우 느린가? 사람들이 일반적으로 50k 행 문자열 격자에 문제가 있습니까? – Mawg

3

당신은 높은 볼륨 내장되어 가상 트 리뷰,보고 할 수 있습니다 : 가상 모드에서의 뷰 TListView 구성 요소가 자주 권장 http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

+0

+1 Darian, 사과드립니다. 내가 모욕적이라고 생각하는 게시물에 응답 할 때 질문을 업데이트 한 것처럼 보일 수 있습니다. 사실, 어떤 사람들은 공감없이 "X 사용"이라고 말할지도 모릅니다.이 질문은 저와 다른 사람들에게 도움이되지 않습니다. 왜이 질문을 읽었습니까? 왜 우리가 이해한다면 도움이 될 것입니다.질문을 편집 할 때까지 나는 당신의 대답을 보지 못했습니다. – Mawg

+0

Thansk, Darian, 나는 그것에 대해 좋은 것을 검색하고 읽었지만, Tree View라고 불리는 것을 체크하지 않았고 그리드를 원했습니다. 더 바보 같았습니다. – Mawg

+1

+1 가상 트리 뷰를 사용하는 것이 가장 좋습니다. Soft Gems 웹 사이트에서 스크린 샷을 확인하면 문자열 그리드보기를 비롯하여이 구성 요소의 다양한 "디스플레이 모드"를 볼 수 있습니다. –

5

는 (내가 직접 시도하지 않은하지만 구현하기가 오히려 쉬운 소리)

+0

+1 감사합니다. 나는 그것을 들여다 볼 것입니다. – Mawg

4

가상 트리 뷰에 관심이 있다면 http://code.google.com/p/virtual-treeview/source/checkout에서 전체 가상 트리 뷰 트렁크를 체크 아웃해야합니다. Demo \ Advanced subdirectory는 Demo 애플리케이션에서 가상 트리 뷰 기능을 보여줍니다 (예 : 가상 트리 뷰를 그리드로 사용하는 방법).

googlecode에서 코드를 체크 아웃하려면 SVN이 필요합니다. SVN을 한번도 다운로드하여 설치하지 않은 분 TortoiseSVN

+0

+1 감사합니다. 매우 도움이됩니다. 그게 내가가는 길이다 – Mawg

관련 문제