Ottieni i vantaggi di un B-Tree in una lingua gestita?

5

La mia comprensione è che una delle caratteristiche chiave di un B-Tree (e di un albero B +) è che è progettato in modo tale che le dimensioni dei suoi nodi siano un po 'più della dimensione del blocco di qualunque supporto i dati siano memorizzati on.

Considerato che, in un linguaggio gestito da memoria come java / c #, non abbiamo realmente accesso a come , quando e quale ordine , i dati sono accessibili dall'unità ... possiamo ancora prevedere il vantaggio principale di questa struttura dati?

    
posta Steven Evers 08.01.2012 - 16:42
fonte

2 risposte

8

Sì, B-Trees ha ancora senso nelle lingue gestite.

Alcuni punti di spiegazione:

  • Se stai usando B-Tree come una struttura dati su disco, allora posso assolutamente garantire che IO del disco sarà il collo di bottiglia , non il fatto che stai utilizzando una lingua gestita .
  • Se si sta utilizzando un B-Tree in memoria, allora può ancora avere un notevole controllo sul layout della memoria da una prospettiva di memorizzazione nella cache. Ad esempio, è possibile utilizzare array di grandi dimensioni per l'archiviazione dei dati in Java / C # e archiviare i nodi / i dati dell'albero negli array utilizzando gli offset anziché disporre di un oggetto separato per rappresentare ciascun nodo dell'albero.
  • I vantaggi di una struttura dati sono largamente indipendenti dalla lingua , almeno fino a un fattore% costante. Quindi se un B-Tree ha senso per il tuo algoritmo / modello di accesso, probabilmente lo farà indipendentemente dalla lingua che stai usando.
  • Oltre a tutto ciò, generalmente Java / C # può essere veloce quasi quanto C / C ++ se ben ottimizzato.
risposta data 09.01.2012 - 01:16
fonte
4

L'uso di un linguaggio gestito come Java, C # ecc. non ha assolutamente nulla a che fare con il modo in cui i dati sono accessibili dall'unità, e in ogni caso non priva certo gli sviluppatori da un limite di controllo su come, quando e in quale ordine i dati saranno accessibili dall'unità.

Il problema è altrove: i linguaggi gestiti soffrono del sovraccarico delle transizioni gestite da native e native to managed, in cui i dati spesso devono essere copiati dai buffer nativi nei buffer gestiti e dal fatto che non offre un supporto rapido e semplice per operazioni intrinsecamente pericolose come il prelievo di quattro byte da una matrice di byte e la loro interpretazione come numero intero. Quindi, quando vuoi fare una cosa del genere devi invocare una funzione che farà la conversione per te, dove in C ++ useresti solo una singola istruzione macchina che dereferisce un puntatore.

Pertanto, un'implementazione di un B-Tree in un linguaggio gestito ne risentirà, ma non sarà dovuta alla mancanza di controllo su come, quando e in quale ordine si accede ai dati dall'unità.

    
risposta data 08.01.2012 - 16:47
fonte

Leggi altre domande sui tag