2012-05-21 16 views
5

मैं इस वर्ग के जो मैं objectify का उपयोग कर बनाए रखना चाहते, इस वर्ग तो वहाँ जो बाइट सरणी का एक टुकड़ा का प्रतिनिधित्व करता है ब्लॉब वस्तुओं की एक सूची है एक डेटा 1 एमबी से बड़ा प्रतिनिधित्व होगा संग्रहीत तुलना में कम है आकार में 1 एमबी:objectify 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>(); 

    ... 

} 

फिर भी, "टुकड़े" @Serialized है, जो इस BigBlob वर्ग/के आकार प्रदान करेगा 1 एमबी से बड़ा आपत्ति है। अगर मैं @Embedded एनोटेशन का उपयोग मैं इस त्रुटि मिलती है

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

:

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

कैसे मुझे यकीन है कि "टुकड़े" एक अलग इकाई के रूप में जमा हो जाती है कर सकता हूँ

इस त्रुटि के कारण?

बीटीडब्ल्यू, मेरे पास पहले से बाइट चंकिंग तर्क है जो पूरे बाइट सरणी को चॉप करता है और ListBlob में टुकड़े डालता है, इसलिए यह प्रश्न बाइट्स को काटने के तरीके से संबंधित नहीं है।

अधिकतर जो मैं जानना चाहता हूं वह स्थायी पक्ष पर अधिक है।

उत्तर

2

रिक का जवाब वास्तव में सबसे अच्छा है।

दूसरी ओर, वहाँ आप डेटा कि 1M किनारे के करीब है भंडारण कर रहे हैं विशेष रूप से अगर, भंडारण धब्बे के लिए विभाजन संस्थाओं उपयोग करने के लिए कुछ अच्छे कारण हैं। आप 100 एमबी ब्लब्स के साथ ऐसा नहीं करना चाहते हैं, लेकिन 2 एमबी ब्लब्स समझ में आ सकते हैं।

सबसे पहले, आप क्रमबद्ध या एम्बेडेड नहीं चाहते हैं। वे एक इकाई के अंदर डेटा संरचना करने के लिए बस तरीके हैं।

इसके अलावा, वहाँ कोई जादू एनोटेशन आप देता है कि अनेक इकाइयों के बीच विभाजन धब्बे है। आपको इसे सब हाथ से करना है। आपको वास्तव में 'मास्टर' या मूल इकाई बनाने की आवश्यकता नहीं है; बस एक आईडी (लेकिन कोई वास्तविक इकाई) द्वारा परिभाषित अभिभावक के साथ सभी इकाई टुकड़े बनाएं और सभी टुकड़ों को लाने के लिए पूर्वजों() क्वेरी का उपयोग करें।

+0

"दूसरी ओर, वहाँ धब्बे भंडारण, खासकर यदि आप डेटा कि 1M किनारे के करीब है भंडारण कर रहे हैं के लिए विभाजन संस्थाओं उपयोग करने के लिए कुछ अच्छे कारण हैं" - वास्तव में, वहाँ कोई कारण नहीं तुम धब्बे छोटे संग्रहीत नहीं कर सकता है ब्लॉबस्टोर में 1 एमबी से भी ज्यादा। –

+2

आप निश्चित रूप से कर सकते हैं, लेकिन ब्लॉबस्टोर से संबंधित एपीआई के साथ काम करने के लिए दर्द होता है और अन्य डेटास्टोर काम के साथ आसानी से लेनदेन नहीं किया जा सकता है। कभी-कभी कई-इकाई हैक के साथ भी डेटास्टोर का उपयोग करना काफी आसान होता है। दूसरी ओर, ब्लॉस्टस्टोर स्टोरेज डाटास्टोर स्टोरेज से सस्ता है, इसलिए इस विकल्प को बेकार ढंग से नहीं बनाया जाना चाहिए। – stickfigure

+0

ब्लॉबस्टोर एपीआई के साथ काम करना मुश्किल है? और आपको एक लेनदेन की आवश्यकता क्यों है जो ब्लॉबस्टोर और डेटास्टोर को फैलाता है? –

4

आप इसे Blobstore में संग्रहीत करना चाहिए और सिर्फ objectify में Blobkey सहेजें। डेटास्टोर के शीर्ष पर काम करता है, ब्लॉबस्टोर नहीं। Blobstore में दुकान धब्बे, खासकर यदि आप GAE के लिए नए और डेटासंग्रह साथ वैचारिक मुद्दों कर रहे हैं -