Implementazione efficace di "array" di tipo Int X String - String in .NET o in generale

2

La domanda in generale è: esiste un modo più efficace di implementazione della tabella con struttura come Dictionary<int, Dictionary<string, string>> ?

Il motivo per cui lo sto chiedendo è perché ho effettuato alcuni test delle prestazioni e non ha dato risultati ottimali per i dati con > 5 milioni di righe. Ora, non ho davvero bisogno di questa quantità di dati, ma stavo vagando se c'è un modo più efficace. Potrebbe anche aiutare le prestazioni per tabelle più piccole con migliaia di righe. Ultimo ma non meno importante, sono interessato a cosa POTREBBE fare per migliorarlo.

Quello che ho pensato è usare string [] [] e avere qualche metodo per trasformare righe / colonne in numeri. Ciò richiederebbe comunque una riscrittura piuttosto significativa del mio lavoro finora. C'è qualcosa di più semplice? Ho bisogno che le righe siano in grado di gestire gli spazi vuoti.

Sfondo del mio progetto:

Ho una struttura prodotta in casa di oggetti che rappresentano una tabella insieme ad alcune funzionalità aggiuntive di cui ho bisogno. Ho una tabella chiamata T e memorizza i dati (righe) in Dictionary<int, TRow> . Ogni TRow ha un altro dictionary<string, TCell> che rappresenta i dati di riga, in cui TCells sono indicizzati per nome di colonna. TCells è fondamentalmente un involucro attorno a una stringa semplice. Tabella e ogni riga ha una definizione Schema (colonna - > {INT, DOUBLE, STRING, BOOL, ...} che viene analizzata quando si ottengono i dati dalla tabella con metodi come .getBool (riga int, colonna di stringhe) ecc. object (T, TRow, TCell) ha molti metodi di supporto che uso, quindi non sono un semplice wrapper con i metodi get.

MODIFICA PER RISPONDERE ALLE DOMANDE DI SEGUITO: Il tavolo è pensato per scopi generali. Nessuna attenzione particolare sulla sola lettura / scrittura. La tabella viene spesso caricata inizialmente dal set di risultati prodotto dalla stored procedure nel database e quindi letti solo da - ma non esclusivamente. La chiave composita è un'idea interessante, ma questo mi spezzerebbe la struttura T, TRow, TCell. Il dizionario INT X STRING - > STRING è solo una semplificazione, come scritto nel mio ultimo paragrafo la tabella T ha Dizionario < int, TRow > e TRow ha il dizionario < string, string & gt ;. Il motivo per cui ho bisogno di mantenere suddivisi Table, Row e Cell è che a volte lavoro direttamente con le righe, ad es. qualche metodo può restituire una singola riga, ecc. Qualche idea per favore? O non c'è niente di meglio: /.

    
posta NeverStopLearning 11.01.2013 - 11:59
fonte

2 risposte

6

Dipende tutto da quali operazioni stai facendo spesso. Scrittura? Lettura? Lavori separatamente con Dictionary<string, string> o lavori sempre con Dictionary<int, Dictionary<string, string>> nel suo insieme? Inoltre, stai dicendo che hai righe e colonne. Li aggiungi / rimuovi o sono costanti per ogni istanza di questo dizionario?

La prima cosa che mi viene in mente è creare una chiave composta da int e string, e usarla come chiave per il dizionario.

public struct IntStringKey
{
    public int A {get; private set;}
    public string B {get; private set;}

    public IntStringKey(int a, string b)
    {
        A = a;
        B = b;
    }

    // override GetHash and Equals here
}

E poi usalo:

Dictionary<IntStringKey, string> data;

Questo renderà più semplice su GC, perché non crei tanti dizionari interni e anche chiami get / set solo una volta.

    
risposta data 11.01.2013 - 12:12
fonte
0

Non sono sicuro che ciò contribuirà a velocizzare, ma in termini di memoria, se le chiavi in TRow sono gli id delle colonne (cioè lo stesso per ogni riga), allora potresti fare qualcosa di simile:

class TColumnData
{
    private readonly IDictionary<string, int> nameToIndex;
    public int IndexFor(string id) => nameToIndex[id];
}

class TRow
{
    private IList<TCell> cells;
    private TColumnData columnData;
    public TCell this[string id] => cells[columnData.IndexFor(id)];
}

Con i costruttori e come appropriato.

    
risposta data 06.09.2018 - 03:34
fonte

Leggi altre domande sui tag