2011-01-05 21 views
5

Trovo che potrebbe essere necessario utilizzare una griglia stringa inferiore a 10 colonne, ma circa 50.000 righe.Come gestire griglie stringa di grandi dimensioni?

Gli esperimenti hanno dimostrato che si tratta di una CPU molto poco reattiva.

Eventuali suggerimenti?

Codice o componenti?

Preferibilmente Delphi (7) build in o TMS (per il quale dispongo di una licenza) o FOSS (per uso commerciale).


Update: per favore non mi dica di utilizzare Virtual Tree View, ecc Si prega di dirmi perché, in modo che possa imparare qualcosa. Grazie.

+1

Dovresti inserire del codice se non vuoi scoprire perché il tuo codice è lento. –

+1

prima, perché hai "bisogno" di caricare 50k righe, puoi solo visualizzare circa 25-50 contemporaneamente sullo schermo? in secondo luogo non ci hai detto quanta memoria ha il tuo sistema (o macchina virtuale) e quanto mangiano quelle 50k righe, se richiede più della memoria di sistema allora la "memoria virtuale" entrerà in gioco e userà l'HDD (o forse , forse solo il tuo SSD) che è wa-ha-hay più lento della RAM. Non prendere il mio commento come un attacco, sto cercando di capire qual è il tuo problema. – ComputerSaysNo

+0

+1 una domanda abbastanza giusta. Posso solo distribuire 20-50 righe, ma ho "bisogno" dei dati da qualche parte. Mayeb I può metterlo in un DB, piuttosto che nella griglia delle stringhe, o forse voglio restare nel mio programma, e non usare un db. In entrambi i casi, avrei due serie di dati: la griglia di stringhe dove tengo 50 righe e soem dove conservo il resto (o tutto), e ho bisogno di un codice complicato per sincronizzarle. Un punto ben fatto, che riflette il motivo per cui pongo questa domanda. – Mawg

risposta

5

Non penso che il problema sia venuto dall'aggiunta di questo numero a TStringGrid.

L'aggiunta di 100k righe ha richiesto meno di 1 secondo (700ms) (PC non di fascia alta, solo Dual Core).

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; 

Penso che la lentezza nel codice, porti i dati dal database? se è così sarà il collo di bottiglia del tuo codice, aggiungendo anche 50k a WHATEVER GRID per mostrare agli utenti chiamati "Cattiva pratica".

Ed è difficile dirti perché è lento senza mostrare alcun codice.

+1

50K righe vanno bene se la griglia ha un qualche tipo di filtro integrato. Non è sempre la soluzione migliore/più performante per fare il filtraggio sul back-end, pensiamo ad OLAP/cubi per esempio. – mjn

+1

@mjn, giusto, ma le sue domande che chiede di aggiungere 50k al normale StringGrid o TMS, che non sono correlate a OLAP/Cubes funziona. –

+0

+1 grazie per la codifica (vorrei poter dare più di +1). Penso che il mio problema potrebbe essere l'utilizzo di una griglia di stringa non db-aware con un db. Ma usare una griglia db-aware renderà le cose molto migliori o sarà comunque molto lento? Le persone hanno normalmente problemi con le griglie di stringa di 50k righe o no? – Mawg

3

Si consiglia di guardare Treeview virtuale, che è costruito per alto volume: http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

+0

+1 Darian, mi scuso. Potrebbe sembrare che ho aggiornato la domanda in risposta al tuo post, che potresti pensare offensivo. In effetti, mi è venuto in mente che alcuni potrebbero semplicemente dire "usare X" senza un reson, che è di minore aiuto per me e per gli altri che leggono questa domanda (sarebbe utile se capissimo perché).Non ho visto la tua risposta fino a dopo che avevo editato la domanda (e hai detto che è costruita per un volume elevato). – Mawg

+0

Thansk, Darian, avevo cercato e letto cose positive a riguardo, ma non l'avevo verificato perché si chiama Tree View e volevo una griglia - più ingannare me. – Mawg

+1

+1 Direi che Virtual Tree View è il meglio che puoi ottenere. Se si controllano gli screenshot sul sito Web di Soft Gems, è possibile visualizzare le varie "modalità di visualizzazione" di questo componente, inclusa la visualizzazione della griglia di stringa. –

5

Il componente TListView in modalità virtuale è raccomandato spesso (non ho provato io stesso, ma suona piuttosto facile da implementare)

+0

+1 Grazie. Vedrò quello – Mawg

4

Se si è interessati alla vista ad albero virtuale, è necessario eseguire il checkout dell'intero trunk treeview virtuale da http://code.google.com/p/virtual-treeview/source/checkout. Troverete la sottodirectory Demos \ Advanced dove e l'applicazione Demo mostra la funzionalità treeview virtuale, ad esempio come utilizzare la visualizzazione ad albero virtuale come griglia.

È necessario SVN per eseguire il checkout del codice da googlecode. Se non hai mai utilizzato SVN, scarica e installa TortoiseSVN

+0

+1 Grazie, che è molto utile. Io quello è il modo in cui andrò – Mawg

Problemi correlati