2012-05-21 13 views
5

Ho questa classe che desidero perseguire usando Objectify, questa classe rappresenterà un dato più grande di 1MB quindi c'è un elenco di oggetti Blob che rappresenta un frammento dell'array di byte memorizzato che è inferiore a 1MB:Memorizzazione di blob di grandi dimensioni con Objective Appengine

@Entity 
public class BigBlob { 

    @Id 
    private Long id; 
    public static final int FRAGMENT_LIMIT = 777 * 1024; 
    @Serialized 
    private List<Blob> fragments = new ArrayList<Blob>(); 

    ... 

} 

Tuttavia, i i "frammenti" è @Serialized, che renderà la dimensione di questa classe BigBlob/oggetto più grande di 1MB.

che causano questo errore:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large. 

Se uso annotazione @Embedded ottengo questo errore:

Cannot place array or collection properties inside @Embedded arrays or collections 

Come faccio a fare in modo che i "frammenti" vengono memorizzati come un'entità separata?

BTW, ho già la logica di chunking di byte che interrompe l'intera matrice di byte e inserisce i frammenti in List di Blob in modo che questa domanda non riguardi come tagliare i byte.

Principalmente quello che voglio sapere è più sul lato persistente.

risposta

2

La risposta di Rick è davvero il migliore - blob del negozio nel blobstore, specialmente se si è nuovi a GAE e si hanno problemi concettuali con il datastore.

D'altra parte, vi sono alcuni buoni motivi per utilizzare le entità di divisione per l'archiviazione di BLOB, soprattutto se si memorizzano dati vicini al bordo 1M. Non si vorrebbe farlo con blob da 100 MB, ma i blob da 2 MB possono avere senso.

Prima di tutto, non vuoi serializzato o incorporato. Questi sono semplicemente modi per strutturare i dati all'interno di una singola entità.

Inoltre, non c'è un'annotazione magica che consente di dividere blob tra le entità. Devi fare tutto a mano. Non è necessario creare effettivamente un 'master' o un'entità radice; è sufficiente creare tutti i frammenti di entità con un genitore definito da un id (ma non un'entità reale) e utilizzare una query ancestor() per recuperare tutti i pezzi.

+0

"D'altra parte, ci sono alcuni buoni motivi per usare le entità split per l'archiviazione dei BLOB, specialmente se si stanno memorizzando dati vicini al margine 1M" - non proprio, non c'è motivo per cui non si possano memorizzare BLOB più piccoli oltre 1 MB nel blobstore. –

+2

Certamente, ma le API correlate al blobstore sono un problema con cui lavorare e non possono essere facilmente trasformate in transazioni con altri lavori di datastore. A volte è molto più semplice usare il datastore, anche con l'hack di più entità. D'altra parte, lo storage blobstore è più economico rispetto all'archivio del datastore, quindi questa scelta non dovrebbe essere resa frivola. – stickfigure

+0

E per quanto riguarda le API di blobstore è difficile lavorare? E perché hai bisogno di una transazione che si estende sul blobstore e sul datastore? –

4

Si dovrebbe archiviarlo nel Blobstore e solo salvare il Blobkey in Objectify. Objectify funziona in cima al datastore, non al blobstore.

Problemi correlati