Domanda

Ho una tabella di mnesia per questo disco.

-record(peer, {
    peer_key,   %% key is the tuple {FileId, PeerId}
    last_seen,
    last_event,
    uploaded = 0,
    downloaded = 0,
    left = 0,
    ip_port,
    key
}).

Peer_key è una tupla {FileId, ClientId}, ora devo estrarre il campo ip_port da tutti i peer che hanno un FileId specifico.

Ho trovato una soluzione praticabile, ma non sono sicuro che questo sia un buon approccio:

qlc:q([IpPort || #peer{peer_key={FileId,_}, ip_port=IpPort} <- mnesia:table(peer), FileId=:=RequiredFileId])

Grazie.

È stato utile?

Soluzione

L'utilizzo del tipo di tabella order_set con una chiave primaria tupla come { FileId, PeerId } e quindi l'associazione parziale di un prefisso della tupla come { RequiredFileId, _ } sarà molto efficiente poiché verrà esaminato solo l'intervallo di chiavi con quel prefisso, non un scansione completa della tabella.È possibile utilizzare qlc:info/1 per esaminare il piano di query e assicurarsi che eventuali selezioni effettuate vincolino il prefisso della chiave.

Altri suggerimenti

Il tempo di risposta crescerà linearmente con la dimensione della tabella, in quanto richiede la scansione attraverso tutte le righe. Quindi, punto di riferimento con i dati della tabella realistici per vedere se è davvero praticabile.

Se è necessario accelerarlo si dovrebbe concentrare sul fatto di poter trovare rapidamente tutti i peer che portano il file id. Ciò potrebbe essere fatto con una tabella di bag-tipo con [fileid, PEERID] come attributi. Dato un file-id si dovrebbe ottenere tutti i peer ID. Con che si potrebbe costruire le chiavi della tabella pari di guardare in alto.

Naturalmente, si avrebbe anche bisogno di mantenere quel tavolo bag-tipo all'interno di ogni transazione che cambia il peer-tavolo.

Un'altra opzione sarebbe quella di ripetere fileid e aggiungere un indice mnesia su quella colonna. Non che sono solo in propri indici secondari di mnesia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top