2012-05-21 7 views
5

Objectiveを使用してこのクラスを維持したい場合、このクラスは1MBを超えるデータを表すため、格納されているバイト配列のフラグメントを表すBLOBオブジェクトのリストがあります。サイズは1メガバイト:Objective Appengineで大規模なBLOBを格納する

@Entity 
public class BigBlob { 

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

    ... 

} 

しかし、「断片」@Serializedされ、このBigBlobクラス/のサイズをレンダリングします1メガバイトよりも大きなオブジェクト。

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

がどのように私は、「断片」は別のエンティティとして保存されていることを確認してください:私はこのエラーを取得する@Embeddedアノテーションを使用している場合

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

このエラーの原因?

私は既に、バイト配列全体をチョップし、ListBlobにフラグメントを入れるバイトチャンクロジックを持っています。この質問は、バイトの切り詰め方法に関するものではありません。

ほとんど私が知りたいことは、永続的な側面です。

答えて

2

リックの答えは、特にあなたがGAEを初めて使い、データストアに概念上の問題がある場合は、BLOBSTOREの中の最高のストアブロブです。

一方、特に1Mエッジに近いデータを格納する場合は、ブロブを格納するためにスプリットエンティティを使用する理由がいくつかあります。これは100MBのブロブでは行いませんが、2MBのブロブは理にかなっています。

まず、シリアル化または埋め込みをしたくないです。これらは、単一のエンティティ内でデータを構造化する簡単な方法です。

また、エンティティ間でブロブを分割できる魔法のアノテーションはありません。あなたは手ですべてそれをしなければなりません。実際に 'マスター'またはルートエンティティを作成する必要はありません。 idで定義された親(実際のエンティティはありません)を持つすべてのエンティティフラグメントを作成し、ancestor()クエリを使用してすべてのピースを取得します。

+0

"特に、1Mエッジに近いデータを格納している場合は、ブロブを格納するためにスプリットエンティティを使用する理由がいくつかあります。実際にはブロブを小さく保存できない理由はありませんブロブストアでも1MB以上です。 –

+2

あなたは確かにそうすることができますが、ブロブストア関連のAPIは他のデータストアの作業とやりとりすることができず、容易にトランザクション化できません。時には、複数のエンティティのハックがあっても、データストアを使用する方がはるかに簡単です。一方、ブロブストアのストレージはデータストアのストレージよりも安価なので、この選択は慎重に行うべきではありません。 – stickfigure

+0

blobstore APIはどのように動作するのが難しいですか?そして、なぜブロブストアとデータストアにまたがるトランザクションが必要なのですか? –

4

これはBlobstoreに格納し、BlobkeyをObjectifyに保存するだけです。 Objectifyは、ブロブストアではなく、データストアの上で動作します。

関連する問題